Python實用技法第12篇:通過公共鍵對字典列表排序:itemgetter

Mark發表於2019-02-16

上一篇文章:Python實用技法第11篇:找出序列中出現次數最多的元素
下一篇文章:Python實用技法第13篇:對自定義類物件排序:attrgetter

1、需求?

我們有一個字典列表,想根據一個或多個字典中的值對列表進行排序。

2、解決方案?

利用operator模組中的itemgetter函式對這類結構進行排序是非常簡單的。

  • 例項:
from operator import itemgetter
rows=[
{`name`:`mark`,`age`:18,`uid`:`110`},
{`name`:`miaomiao`,`age`:28,`uid`:`150`},
{`name`:`miaomiao`,`age`:8,`uid`:`150`},
{`name`:`xiaohei`,`age`:38,`uid`:`130`},
]

rows_by_name=sorted(rows,key=itemgetter(`name`))
rows_by_uid=sorted(rows,key=itemgetter(`uid`))
print(rows_by_name)
print(rows_by_uid)


#itemgetter還支援多個鍵
rows_by_name_age=sorted(rows,key=itemgetter(`name`,`age`))
print(rows_by_name_age)

#itemgetter同樣適用min、max
print(min(rows,key=itemgetter(`uid`)))
print(max(rows,key=itemgetter(`age`)))

執行結果:

[{`name`: `mark`, `age`: 18, `uid`: `110`}, {`name`: `miaomiao`, `age`: 28, `uid`: `150`}, {`name`: `miaomiao`, `age`: 8, `uid`: `150`}, {`name`: `xiaohei`, `age`: 38, `uid`: `130`}]
[{`name`: `mark`, `age`: 18, `uid`: `110`}, {`name`: `xiaohei`, `age`: 38, `uid`: `130`}, {`name`: `miaomiao`, `age`: 28, `uid`: `150`}, {`name`: `miaomiao`, `age`: 8, `uid`: `150`}]
[{`name`: `mark`, `age`: 18, `uid`: `110`}, {`name`: `miaomiao`, `age`: 8, `uid`: `150`}, {`name`: `miaomiao`, `age`: 28, `uid`: `150`}, {`name`: `xiaohei`, `age`: 38, `uid`: `130`}]
{`name`: `mark`, `age`: 18, `uid`: `110`}
{`name`: `xiaohei`, `age`: 38, `uid`: `130`}
  • 討論

在這個例子中,rows被傳遞給內建的sorted()函式,該函式接受一個關鍵字引數key,這個引數應該代表一個可呼叫物件(callable),該物件從rows中接受一個單獨的元素作為輸入並返回一個用來做排序依據的值。itemgetter()函式建立的就是這樣的一個可呼叫物件。

函式operator.itemgetter()接受的引數可作為查詢的標記,用來從rows的記錄中提取出所需要的值。它可以是字典的鍵名稱、用數字表示的列表元素或是任何可以傳給物件的__getitem__()方法的值。如果傳多個標記給itemgetter(),那麼它產生的可呼叫物件將返回一個包含所有元素在內的元組,然後sorted()將根據對元組的排序結果來排列輸出結果。如果想同時針對多個欄位做排序,那麼這是非常有用的。

有時候會用lambda表示式取代itemgetter()的功能,例如:

rows_by_uid=sorted(rows,key=lambda r:r[`uid`])
rows_by_name_age=sorted(rows,key=lambda r:(r[`name`,`age`]))

這種解決方案通常也能正常工作。但是用itemgetter()通常會執行的更快一些。因此如果需要考慮效能問題的話,應該使用itemgetter().

上一篇文章:Python實用技法第11篇:找出序列中出現次數最多的元素
下一篇文章:Python實用技法第13篇:對自定義類物件排序:attrgetter

相關文章