python對列表,字典及對象的排序方法

python 列表,字典及對象排序相關整理

今天工作中遇到一個合併excel後需要根據每一列長度降序的方式將內容(列表嵌套)寫入.其中涉及到將外層列表根據每一個嵌套列表的長度進行排序,因此回到家後整理一下python對列表以及對象排序的方法, python自帶的 sort() 不在討論範圍內.

##1.列表嵌套中的排序

代碼:

# –*– coding: utf-8 –*–
# @Time      : 2019/2/20 21:27
# @Author    : Damon_duanlei
# @FileName  : test.py
# @BlogsAddr : https://blog.csdn.net/Damon_duanlei

# 測試數據 名稱 性別 年齡 體重
sort_list = [["臭臭", "boy", 9, 10], ["小迪", "boy", 2, 12], ["笨笨", "girl", 4, 6], ["亮亮", "boy", 2, 8]]

# 使用 sorted() 函數對指定字段排序(體重)
new_list_1 = sorted(sort_list, key=lambda dog: dog[3])  # 匿名函數指定排序字段
# 降序
new_list_2 = sorted(sort_list, key=lambda dog: dog[3], reverse=True)

print("按體重升序:{}".format(new_list_1))
print("按體重降序:{}".format(new_list_2))


運行結果:

>>>
按體重升序:[['笨笨', 'girl', 4, 6], ['亮亮', 'boy', 2, 8], ['臭臭', 'boy', 9, 10], ['小迪', 'boy', 2, 12]]
按體重降序:[['小迪', 'boy', 2, 12], ['臭臭', 'boy', 9, 10], ['亮亮', 'boy', 2, 8], ['笨笨', 'girl', 4, 6]]

2.對列表內對象排序

上述的今日工作遇到的排序問題就是使用對象排序的方法處理.首先需要根據排序依據定義一個類,添加一個實例屬性用作排序依據,隨後使用原始數據進行實例化,最後根據排序依據屬性對實例化的對象進行排序.

代碼:

# –*– coding: utf-8 –*–
# @Time      : 2019/2/20 21:27
# @Author    : Damon_duanlei
# @FileName  : test.py
# @BlogsAddr : https://blog.csdn.net/Damon_duanlei

# 測試數據 名稱 性別 年齡 體重
dog_list = [["臭臭", "boy", 9, 10], ["小迪", "boy", 2, 12], ["笨笨", "girl", 4, 6], ["亮亮", "boy", 2, 8]]


# 創建一個Dog類
class Dog(object):
    def __init__(self, name, gender, age, weight):
        self.name = name
        self.gender = gender
        self.age = age
        self.weight = weight

    def __str__(self):
        return "object_{}".format(self.name)
    # Python 定義了__str__()和__repr__()兩種方法,__str__()用於顯示給用戶,而__repr__()用於顯示給開發人員。
    # 有一個偷懶的定義__repr__的方法:
    __repr__ = __str__


# 對象實例化
object_list = [Dog(dog[0], dog[1], dog[2], dog[3]) for dog in dog_list]

print("排序前順序:{}".format(object_list))

# 對列表中的對象排序(體重)
object_list.sort(key=lambda dog: dog.weight)

print("根據體重排序後順序:{}".format(object_list))

運行結果:

排序前順序:[object_臭臭, object_小迪, object_笨笨, object_亮亮]
根據體重排序後順序:[object_笨笨, object_亮亮, object_臭臭, object_小迪]

同理可以對嵌套列表的 len() 平均值 等進行排序

3.使用 operator 模塊 對多個字段進行排序

代碼:

# –*– coding: utf-8 –*–
# @Time      : 2019/2/20 21:27
# @Author    : Damon_duanlei
# @FileName  : test.py
# @BlogsAddr : https://blog.csdn.net/Damon_duanlei

import operator

# 測試數據 名稱 性別 年齡 體重
dog_list = [["臭臭", "boy", 9, 10], ["小迪", "boy", 2, 12], ["笨笨", "girl", 4, 6], ["亮亮", "boy", 2, 8]]


# 創建一個Dog類
class Dog(object):
    def __init__(self, name, gender, age, weight):
        self.name = name
        self.gender = gender
        self.age = age
        self.weight = weight

    def __str__(self):
        return "object_{}".format(self.name)

    # Python 定義了__str__()和__repr__()兩種方法,__str__()用於顯示給用戶,而__repr__()用於顯示給開發人員。
    # 有一個偷懶的定義__repr__的方法:
    __repr__ = __str__


# 對象實例化
object_list = [Dog(dog[0], dog[1], dog[2], dog[3]) for dog in dog_list]

print("排序前順序:{}".format(object_list))

# 對列表中的對象排序(年齡,體重)
sort_key = operator.attrgetter("age", "weight")  # 傳入參數爲排序屬性,優先級從前往後
object_list.sort(key=sort_key)

print("根據年齡,體重排序後順序:{}".format(object_list))

運行結果:

排序前順序:[object_臭臭, object_小迪, object_笨笨, object_亮亮]
根據年齡,體重排序後順序:[object_亮亮, object_小迪, object_笨笨, object_臭臭]

4.字典對 鍵/值 排序

python字典的定義—字典本身默認以key的字符順序輸出顯示—就像我們用的真實的字典一樣,按照abcd字母的順序排列,並且本質上各自沒有先後關係,是一個哈希表的結構:

但有網上資料和實際測試 python 3.6開始,字典顯示的順序與定義的過程有關,即按照定義鍵的順序顯示

# –*– coding: utf-8 –*–
# @Time      : 2019/3/6 21:19
# @Author    : Damon_duanlei
# @FileName  : test02.py
# @BlogsAddr : https://blog.csdn.net/Damon_duanlei

import operator

test_dict = {"name": "臭臭", "age": "9 years old", "gender": "boy", "weight": "5KG "}
print("排序前字典:{}".format(test_dict))
# 字典的 .item()方法 將字典的鍵值對以列表嵌套元組的形式返回
# print(test_dict.items())

after_sort = sorted(test_dict.items(), key=operator.itemgetter(0))  # itemgetter 後用圓括號() 而非中括號[]
# print(after_sort)

sort_dict = dict(after_sort)
print("排序後字典:{}".format(sort_dict))

運行結果:

>>>
排序前字典:{'name': '臭臭', 'age': '9 years old', 'gender': 'boy', 'weight': '5KG '}
排序後字典:{'age': '9 years old', 'gender': 'boy', 'name': '臭臭', 'weight': '5KG '}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章