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