上一篇我們聊到python 字典和列表巢狀用法,這次我們聊聊字典和列表巢狀中的排序問題,這個在python基礎中不會提到,但實際經常運用,面試中也喜歡問,我們娓娓道來。

在說組合排序之前,先來看看排序有哪些函式。

排序函式

使用排序有兩個可用方法,分別是sort()sorted()

  • sort():內建方法,會改變原來列表的排序、只適用於列表排序、所以效率高。
  • sorted():全域性,可迭代任意物件(字串,元組,列表,字典等)

sort()使用例子:

簡單的使用:

>>> L = [5,8,9,3,2,7]
>>> L.sort()
>>> print(L)
[2, 3, 5, 7, 8, 9]

指定關鍵字的排序:

## 列表巢狀列表
>>> user = [['Jone', '181', 30], ['Chan', '175', 26], ['Paul', '178', 22]]
>>> user.sort(key=lambda user: user[2])
>>> print(user)
[['Paul', '178', 22], ['Chan', '175', 26], ['Jone', '181', 30]]

也可以用cmp函式實現,不過python3.0後為了語言簡化和統一,已經被徹底移除,這裡不再贅述。

sorted()使用例子:

排序任意物件:

>>> A = 'Python'
>>> print(sorted(A))
['P', 'h', 'n', 'o', 't', 'y']
>>> print(A)
Python
>>>
>>> B = (3, 6, 7, 2, 9)
>>> print(sorted(B))
[2, 3, 6, 7, 9]
>>> print(B)
(3, 6, 7, 2, 9)
>>>
>>> C = [3, 6, 7, 2, 9]
>>> print(sorted(C))
[2, 3, 6, 7, 9]
>>> print(C)
[3, 6, 7, 2, 9]
>>>

根據鍵值的字典排序:

## 按照鍵值(value)排序
>>> D = {'a': '3', 'b': '6', 'c': '2'}
>>> ds = sorted(D.items(), key=lambda x: x[1], reverse=True)
>>> print(ds)
[('b', '6'), ('a', '3'), ('c', '2')]
## 按照鍵名(key)排序
>>> D = {'a': '3', 'b': '6', 'c': '2'}
>>> ds = sorted(D.items(), key=lambda x: x[0], reverse=True)
>>> print(ds)
[('c', '2'), ('b', '6'), ('a', '3')]

幾種常見的排序場景

  1. 列表中巢狀字典,根據字典的值排序
## 使用lambda方式
>>> D = [{"name": '張三', 'score': 68}, {'name': '李四', 'score': 97}]
>>> ds = sorted(D, key=lambda x:x['score'], reverse=True)
>>> print(ds)
[{'name': '李四', 'score': 97}, {'name': '張三', 'score': 68}]
>>>
## 使用operator方式
>>> import operator
>>> D = [{"name": '張三', 'score': 68}, {'name': '李四', 'score': 97}]
>>> D.sort(key=operator.itemgetter('score'), reverse=True)
>>> print(D)
[{'name': '李四', 'score': 97}, {'name': '張三', 'score': 68}]
>>>
  1. 列表中巢狀字典,鍵不同的情況下對值進行排序

可以將列表中的字典先放入到一個大字典中,對整個字典進行排序,在排序完成後,再轉換為列表包含字典的形式即可。

>>> from operator import itemgetter
>>> dict_list = [{"ming": 87}, {"mei": 93}, {"hua": 68}, {"jon": 75}, {"ston": 100}, {"jack": 56}]
>>> mid_dict = {key: value for x in dict_list for key, value in x.items()}
>>> mid_list = sorted(mid_dict.items(), key=itemgetter(1))
>>> print(mid_list)
[('jack', 56), ('hua', 68), ('jon', 75), ('ming', 87), ('mei', 93), ('ston', 100)]
>>> fin_list = [{x[0]: x[1]} for x in mid_list]
>>> print(fin_list)
[{'jack': 56}, {'hua': 68}, {'jon': 75}, {'ming': 87}, {'mei': 93}, {'ston': 100}]
>>>
  1. 字典巢狀字典的排序:
>>> D={10:{'aa':1,'bb':2},11:{'aa':2,'bb':0},12:{'aa':0,'bb':3}}
>>> ds=sorted(D.items(), key=lambda x: x[1]['bb'])
>>> print(ds)
[(11, {'aa': 2, 'bb': 0}), (10, {'aa': 1, 'bb': 2}), (12, {'aa': 0, 'bb': 3})]
>>>

---- 鋼鐵 [email protected] 07.22.2021

參考文件

python排序sort()和sorted()區別:

https://zhuanlan.zhihu.com/p/59702850

列表排序方法sort、sorted技巧篇:

https://blog.csdn.net/bbbeoy/article/details/79741303

字典 列表 巢狀 複雜排序大全:

https://blog.csdn.net/ray_up/article/details/42084863

列表中巢狀字典,根據字典的值排序:

https://blog.csdn.net/Thomas0713/article/details/83028414