operator.itemgetter,itertools import groupby

operator.itemgetter函數
operator模塊提供的itemgetter函數用於獲取對象的哪些維的數據,參數爲一些序號(即需要獲取的數據在對象中的序號),下面看例子。

>>> a = [1,2,3,4,5,6]
>>> b = operator.itemgetter(1)
>>> b
operator.itemgetter(1)
>>> b(a)
2
>>> c =operator.itemgetter(3)
>>> c(a)
4

定義函數x,獲取對象的第3個域和第1個的值

>>> x = operator.itemgetter(3,1)
>>> x(a)
(4, 2)
>>> 

要注意,operator.itemgetter函數獲取的不是值,而是定義了一個函數,通過該函數作用到對象上才能獲取值。

sorted函數

a = ("b", "g", "a", "d", "f", "c", "h", "e")
>>> x = sorted(a)
>>> x
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
>>> y =sorted(a, reverse=True)
>>> y
['h', 'g', 'f', 'e', 'd', 'c', 'b', 'a']
>>> 
>

Python內置的排序函數sorted可以對list或者iterator進行排序,官網文檔見:http://docs.python.org/2/library/functions.html?highlight=sorted#sorted,該函數原型爲:

sorted(iterable[, cmp[, key[, reverse]]])

參數解釋:

(1)iterable指定要排序的list或者iterable,不用多說;

(2)cmp爲函數,指定排序時進行比較的函數,可以指定一個函數或者lambda函數,如:

students爲類對象的list,沒個成員有三個域,用sorted進行比較時可以自己定cmp函數,例如這裏要通過比較第三個數據成員來排序,代碼可以這樣寫:

students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
   sorted(students, key=lambda student : student[2])

(3)key爲函數,指定取待排序元素的哪一項進行排序,函數用上面的例子來說明,代碼如下:

 sorted(students, key=lambda student : student[2]) 

key指定的lambda函數功能是去元素student的第三個域(即:student[2]),因此sorted排序時,會以students所有元素的第三個域來進行排序。
有了上面的operator.itemgetter函數,也可以用該函數來實現,例如要通過student的第三個域排序,可以這麼寫:

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

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

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

即先跟句第二個域排序,再根據第三個域排序。
(4)reverse參數就不用多說了,是一個bool變量,表示升序還是降序排列,默認爲false(升序排列),定義爲True時將按降序排列。

sorted函數更多的例子可以參考官網文檔:https://wiki.python.org/moin/HowTo/Sorting/。

itemgetter字典排序

from operator import itemgetter
rows = [
    {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
    {'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
    {'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
    {'fname': 'Big', 'lname': 'Jones', 'uid': 1004}
]
rows_byfname = sorted(rows, key= itemgetter('fname'))
>>> rows_byfname
[{'fname': 'Big', 'uid': 1004, 'lname': 'Jones'}, {'fname': 'Brian', 'uid': 1003, 'lname': 'Jones'}, {'fname': 'David', 'uid': 1002, 'lname': 'Beazley'}, {'fname': 'John', 'uid': 1001, 'lname': 'Cleese'}]
a = sorted(rows, key=itemgetter('uid'),reverse=True)//true爲降序排列
>>> a
[{'fname': 'Big', 'uid': 1004, 'lname': 'Jones'}, {'fname': 'Brian', 'uid': 1003, 'lname': 'Jones'}, {'fname': 'David', 'uid': 1002, 'lname': 'Beazley'}, {'fname': 'John', 'uid': 1001, 'lname': 'Cleese'}]
>>> 

也可以用lambda:

>>> sb =sorted(rows,key= lambda x: x['uid'])
>>> print(sb)
[{'fname': 'John', 'uid': 1001, 'lname': 'Cleese'}, {'fname': 'David', 'uid': 1002, 'lname': 'Beazley'}, {'fname': 'Brian', 'uid': 1003, 'lname': 'Jones'}, {'fname': 'Big', 'uid': 1004, 'lname': 'Jones'}]
>>> 

https://www.jb51.net/article/143636.htm

itertools.groupby

>>> from itertools import groupby
>>> 
>>> L = [("a", 1), ("a", 2), ("b", 3), ("b", 4)]
>>> key_func = lambda x: x[0]
>>> for key, group in groupby(L, key_func):
	print(key + " :", list(group))

	
a : [('a', 1), ('a', 2)]
b : [('b', 3), ('b', 4)]
>>> 
>>> a_list = [("Animal", "cat"),  
          ("Animal", "dog"),  
          ("Bird", "peacock"),  
          ("Bird", "pigeon")]
>>> 
>>> an_iterator = groupby(a_list, lambda x : x[0])
>>> for key, group in an_iterator: 
    key_and_group = {key : list(group)} 
    print(key_and_group)

    
{'Animal': [('Animal', 'cat'), ('Animal', 'dog')]}
{'Bird': [('Bird', 'peacock'), ('Bird', 'pigeon')]}
>>> 

用groupby分組已空字符爲間隔的list :

from itertools import groupby
test_list = ['Geeks', 'for', '', 'Geeks', 1, 2,'','a','b',]
res = [list(sub) for ele, sub in groupby(test_list, key = bool) if ele]
>>> res
[['Geeks', 'for'], ['Geeks', 1, 2], ['a', 'b']] 	

爲何可以用key = bool 呢?

>>> bool
<class 'bool'>
>>> bool(bool)
True
>>> bool('')
False
>>> 

另外一個例子:

>>> numbers = [1, 1, 1, 3, 3, 2, 2, 2, 1, 1]
>>> for (key,group) in groupby(numbers):
	print (key,list(group))

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