用sort(),sorted()對列表的數據,字典和對象進行排序

在對列表進行操作時,往往會用到排序,同時由於列表中存儲的數據類型繁多,在面臨着不同的排序要求。現在我們總結一下用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方法獲取排序依據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章