python中字典的排序(Ordered
- 2020 年 1 月 6 日
- 筆記
1 首先介紹一下 sorted() 函數:
輸入程式碼:print(help(sorted)), 查看函數用法
輸出為:
Help on built-in function sorted in module builtins:
sorted(iterable, key=None, reverse=False)
Return a new list containing all items from the iterable in ascending order.
A custom key function can be supplied to customize the sort order, and the
reverse flag can be set to request the result in descending order.
None
sorted(iterable, key=None, reverse=False) , 返回一個有序的列表
iterable , 一個可以迭代的對象
key , 用來比較的對象,可以省略
reverse , 指定是否顛倒,即是否逆序,默認是正序, 可以省略
2 使用 sorted 對字典排序,注意字典的鍵key值都是同類型的
test = {1: "a", 3: "d", 6: "g", 2: "c", 5: "e", 0: "f", 4: 'b'}
# 對字典的key值列表排序,返回列表
print(sorted(test.keys()))
# 對字典的鍵值對元組列表排序,按元組的第1個元素排序,也就是 key
# 返回的是一個元組列表
print(sorted(test.items(), key=lambda obj: obj[0]))
# 對字典的鍵值對元組列表排序,按元組的第2個元素排序,也就是 value
# 返回的是一個元組列表
print(sorted(test.items(), key=lambda obj: obj[1]))
輸出結果為:
[0, 1, 2, 3, 4, 5, 6]
[(0, 'f'), (1, 'a'), (2, 'c'), (3, 'd'), (4, 'b'), (5, 'e'), (6, 'g')]
[(1, 'a'), (4, 'b'), (2, 'c'), (3, 'd'), (5, 'e'), (0, 'f'), (6, 'g')]
如果要反序,添加 reverse=True 即可, 如:sorted(test.keys(), reverse=True)
3 使用 OrderedDict 對字典排序
from collections import OrderedDict
test = {1: "a", 3: "d", 6: "g", 2: "c", 5: "e", 0: "f", 4: 'b'}
# 普通 dict 插入元素時是無序的,使用 OrderedDict 按元素插入順序排序
# 對字典按key排序, 默認升序, 返回 OrderedDict
def sort_key(old_dict, reverse=False):
"""對字典按key排序, 默認升序, 不修改原先字典"""
# 先獲得排序後的key列表
keys = sorted(old_dict.keys(), reverse=reverse)
# 創建一個新的空字典
new_dict = OrderedDict()
# 遍歷 key 列表
for key in keys:
new_dict[key] = old_dict[key]
return new_dict
# 對字典按 value 排序,默認升序, 返回 OrderedDict
def sort_value(old_dict, reverse=False):
"""對字典按 value 排序, 默認升序, 不修改原先字典"""
# 獲取按 value 排序後的元組列表
items = sorted(old_dict.items(), key=lambda obj: obj[1], reverse=reverse)
# 創建一個新的空字典
new_dict = OrderedDict()
# 遍歷 items 列表
for item in items:
# item[0] 存的是 key 值
new_dict[item[0]] = old_dict[item[0]]
return new_dict
print(sort_key(c))
print(sort_value(c))
輸出結果為:
OrderedDict([(0, 'f'), (1, 'a'), (2, 'c'), (3, 'd'), (4, 'b'), (5, 'e'), (6, 'g')])
OrderedDict([(1, 'a'), (4, 'b'), (2, 'c'), (3, 'd'), (5, 'e'), (0, 'f'), (6, 'g')])
使用 OrderedDict 可以保證元素按插入順序排序,如果修改上面函數:
# 創建一個新的空字典
new_dict = {}
這樣創建的就是一個普通字典,雖然之前已經對key或value排好序了,但是插入的時候還是無序的,所以沒作用。
簡化使用 OrderedDict :
from collections import OrderedDict
test = {1: "a", 3: "d", 6: "g", 2: "c", 5: "e", 0: "f", 4: 'b'}
print(OrderedDict(sorted(test.items(), key=lambda obj: obj[0])))
print(OrderedDict(sorted(test.items(), key=lambda obj: obj[1])))
輸出結果還是和之前一樣:
OrderedDict([(0, 'f'), (1, 'a'), (2, 'c'), (3, 'd'), (4, 'b'), (5, 'e'), (6, 'g')])
OrderedDict([(1, 'a'), (4, 'b'), (2, 'c'), (3, 'd'), (5, 'e'), (0, 'f'), (6, 'g')])