在對列表進行操作時,往往會用到排序,同時由於列表中存儲的數據類型繁多,在面臨着不同的排序要求。現在我們總結一下用sort(),sorted()對列表的數據,字典和對象進行排序。由於排序可以分成正序和倒序,同時有可以改變原列表與否的區分,還有不同存儲內容,因此組合頗多,我們一一介紹。
sort()的用法
sort()函數的定義是def sort(self, key=None, reverse=False)。用法是
list.sort()`,它改變原來list的順序。reverse參數表示倒序和正序排序。當爲True時,爲倒序排序,默認爲正序排序。
sorted()的用法
sorted()函數的定義爲def sorted(*args, **kwargs)
,一般用法是sorted(list,key=[], reverse=False).。它不改變原來list的順序,需要有變量接收返回值。reverse參數表示倒序和正序排序。當爲True時,爲倒序排序,默認爲正序排序。
一般數字列表排序
1. 正序遞增排序,改變原來列表
list_test=[3,2,4,5,6,7,34]
list_test.sort()
print(list_test)
結果爲:
[2, 3, 4, 5, 6, 7, 34]
2. 倒序遞減排序,改變原來列表
list_test=[3,2,4,5,6,7,34]
list_test.sort(reverse=True)
print(list_test)
結果爲
[34, 7, 6, 5, 4, 3, 2]
3. 正序遞增排序,不改變原來列表
list_test=[3,2,4,5,6,7,34]
list_v=sorted(list_test)
print(list_test)
print(list_v)
print('-----------')
結果爲
[3, 2, 4, 5, 6, 7, 34]
[2, 3, 4, 5, 6, 7, 34]
-----------
4. 倒序遞減排序,不改變原來列表
list_test=[3,2,4,5,6,7,34]
list_v=sorted(list_test,reverse=True)
print(list_test)
print(list_v)
結果爲
[3, 2, 4, 5, 6, 7, 34]
[34, 7, 6, 5, 4, 3, 2]
包含字典的列表排序
當列表裏的數據是字典時,需要根據字典的k-v中的一個進行排序時,需要用到lamda表達方式,從字典的k-v中獲取排序的依據。
1. 不改變原來列表的排序
list1 = [{'name': 'Kevin', 'age': 27}, {'name': 'Ling', 'age': 23},{'name': 'Liu', 'age': 24}]
# 升序
list2 = sorted(list1, key=lambda list1: list1["age"])
print("開始列表:{}".format(list1))
print("升序後列表:{}".format(list2))
# 降序
list2 = sorted(list1, key=lambda list1: list1.get("age"), reverse=True)
print("開始列表:{}".format(list1))
print("降序後列表:{}".format(list2))
其中,key=lambda list1: list1.get("age")
和key=lambda list1: list1["age"]
都是從字典元素list1裏獲取排布依據。結果爲
開始列表:[{'age': 27, 'name': 'Kevin'}, {'age': 23, 'name': 'Ling'}, {'age': 24, 'name': 'Liu'}]
升序後列表:[{'age': 23, 'name': 'Ling'}, {'age': 24, 'name': 'Liu'}, {'age': 27, 'name': 'Kevin'}]
開始列表:[{'age': 27, 'name': 'Kevin'}, {'age': 23, 'name': 'Ling'}, {'age': 24, 'name': 'Liu'}]
降序後列表:[{'age': 27, 'name': 'Kevin'}, {'age': 24, 'name': 'Liu'}, {'age': 23, 'name': 'Ling'}]
2. 改變原來列表的排序
list1 = [{'name': 'Kevin', 'age': 27}, {'name': 'Ling', 'age': 23},{'name': 'Liu', 'age': 24}]
list1.sort(key=lambda list1: list1["age"])
print("列表:{}".format(list1))
結果爲如下。如果要降序,則添加reverse=True
。
列表:[{'age': 23, 'name': 'Ling'}, {'age': 24, 'name': 'Liu'}, {'age': 27, 'name': 'Kevin'}]
包含對象的列表排序
當列表裏的數據是對象的時候,排序方法與前面含字典的列表排序類似,使用lambda方法,把對象的某個屬性作爲排序依據。
1. 包含對象的列表排序
下面用構建一個包含對象的列表,然後進行排序
class Student():
def __init__(self,name,age):
self.name=name
self.age=age
students=[]
students.append(Student('jim',12))
students.append(Student('jack',13))
students.append(Student('rose',11))
for s in students:
print(s.name, s.age)
print('------sort----------')
students.sort(key=lambda ss: ss.age, reverse=True)
for s in students:
print(s.name, s.age)
結果如下。可以看到用key=lambda ss: ss.age
這個表達式,就可以按照對象的age屬性排序。
jim 12
jack 13
rose 11
------sort----------
jack 13
jim 12
rose 11
如果不改變原來students列表的順序,用sorted方法即可。
對字典排序
除了對列表排序,我們還可以對字典進行排序。
dict1 = {"name": "Kevin", "age": "27", "gender": "true"}
# 升序
dict2 = sorted(dict1.items(), key=lambda dict1: dict1[0], reverse=False)
print("開始的字典數據:{}".format(dict1))
print("按照鍵進行升序後的數據:{}".format(dict2))
dict1 = {"name": "Kevin", "age": "27", "gender": "true"}
# 降序
dict2 = sorted(dict1.items(), key=lambda dict1: dict1[0], reverse=True)
print("開始的字典數據:{}".format(dict1))
print("按照鍵進行降序後的數據:{}".format(dict2))
如果要按照值來排序,這選取dict1[1]作爲排序依據或者用字典的get方法獲取排序依據。