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]
>>>