Python之operator.itemgetter函式和sorted函式

weixin_34249678發表於2018-08-05

operator.itemgetter函式

operator模組提供的itemgetter函式用於獲取物件不同維的資料(理解看下面的例子),引數為需要獲取的 資料在物件中的序號:

from operator import itemgetter
#從operator模組匯入itemgetter函式 
>>> a=[1,2,3]
>>> b=itemgetter(1)
>>> b=(a)
2

>>> b=itemgetter(0,1)
>>> b(a)
(1,2)

要注意,operaot.itemgetter函式獲取的不是值,而是定義了一個函式,通過該函式作用到物件上才能獲取值。

sorted函式

Python內建的排序函式sorted可以對list獲知iterator進行排序。

該函式原型為:sorted(iterable[, cmp[, key[, reverse]]])

引數解釋:

  1. literable為指定要排序的可迭代物件

  2. cmp為函式,指定排序時進行比較的函式,可以指定一個函式或者lambda函式

例:

students為一個list,每個成員有三個域,用sorted函式進行比較時可以自己定按照什麼進行排序,也就是設定cmp函式。這裡要按照第三個域來排序:

>>> students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
>>> sorted(students, key=lambda student : student[2])
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
  1. key為函式,指定取待排序元素的哪一項進行排序,舉例如下:
>>> students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
>>> sorted(students, key=lambda student : student[2]) 
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

key指定的lambda函式功能是去元素student的第三個域(即:student[2]),因此sorted排序時,會以students所有元素的第三個域來進行排序。

有了上面的operator.itemgetter函式,也可以用該函式來實現,例如要通過student的第三個域排序,可以這麼寫:

sorted(students, key=operator.itemgetter(2))

sorted函式也可以進行多級排序,例如要根據第二個域和第三個域進行排序,可以這麼寫:

sorted(students, key=operator.itemgetter(1,2))

綜合示例

假設我們用一組tuple表示學生名字和成績:

L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]

sorted對上述列表按名字排序,再按成績從低到高排序,以及按照成績從高到低排序:

from operator import itemgetter
students = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]

print(sorted(students, key=itemgetter(0)))
print(sorted(students, key=lambda t: t[1]))
print(sorted(students, key=itemgetter(1), reverse=True))
7216746-12f71945a9a91143.png
綜合示例.png

相關文章