Python通過公共鍵對字典列表排序

  • 根據一個或多個字典中的值來對列表排序
users = [
    {'name':'jack','age':25,'height':180},
    {'name':'amor','age':23,'height':177},
    {'name':'niko','age':45,'height':169},
    {'name':'lops','age':20,'height':168},
    {'name':'fdop','age':33,'height':189},
    {'name':'bon','age':22,'height':168},
    {'name':'rom','age':26,'height':166},
    {'name':'gogo','age':18,'height':177},
]
# 通過公共列age排序,反序的話添加reversed=True
sort_by_age = sorted(users,key=lambda x:x['age'])
print(sort_by_age)

# 輸出
[{'name': 'gogo', 'age': 18, 'height': 177},
 {'name': 'lops', 'age': 20, 'height': 168},
 {'name': 'bon', 'age': 22, 'height': 168},
 {'name': 'amor', 'age': 23, 'height': 177},
 {'name': 'jack', 'age': 25, 'height': 180},
 {'name': 'rom', 'age': 26, 'height': 166},
 {'name': 'fdop', 'age': 33, 'height': 189},
 {'name': 'niko', 'age': 45, 'height': 169}]

operator模塊中的itemgetter

itemgetter()通常要比lambda要快一些

from operator import itemgetter
sort_by_age = sorted(users,key=itemgetter('age'))
# 結果和上面完全一樣

# 接受多個
by_height_age = sorted(users,key=itemgetter('height','age'))
print(by_height_age)
# 輸出
[{'name': 'rom', 'age': 26, 'height': 166},
 {'name': 'lops', 'age': 20, 'height': 168},  # height相同再通過age排序
 {'name': 'bon', 'age': 22, 'height': 168},
 {'name': 'niko', 'age': 45, 'height': 169},
 {'name': 'gogo', 'age': 18, 'height': 177}, 
 {'name': 'amor', 'age': 23, 'height': 177}, 
 {'name': 'jack', 'age': 25, 'height': 180}, 
 {'name': 'fdop', 'age': 33, 'height': 189}]
  • 同樣也支持maxmin函數
# 獲取height最大的
max(users,key=itemgetter('age'))
  • 取出序列中的前幾個或後幾個

heapq模塊中的nlargestnsmallest

from heapq import nlargest,nsmallest
from operator import itemgetter

# 簡單序列
nums = [21,1,546,6,269,236,344,56,3]

# 最大三個
print(nlargest(3,nums))

# 最小三個
print(nsmallest(3,nums))

# 輸出
[546, 344, 269]
[1, 3, 6]


# 複雜序列,就用上面的users

# 年齡最大三人
# sort_age = nlargest(3,users, key=lambda a: a['age'])
sort_age = nlargest(3,users, key=itemgetter('age'))
print(sort_age)

# 最矮三人
sort_height = nsmallest(3, users, key=itemgetter('height'))
print(sort_height)

# 輸出
[{'name': 'niko', 'age': 45, 'height': 169},
 {'name': 'fdop', 'age': 33, 'height': 189},
 {'name': 'rom', 'age': 26, 'height': 166}]

[{'name': 'rom', 'age': 26, 'height': 166},
 {'name': 'lops', 'age': 20, 'height': 168},
 {'name': 'bon', 'age': 22, 'height': 168}]

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