itemgetter和groupby
一. itemgetter的使用方法
itemgetter()返回一个指定列表下标或者字典键的函数,通过这个返回的函数作用到对象上,获得才能取得相应的值
1. 排序字典列表的一个例子
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_by_fname = sorted(rows, key=itemgetter('fname')) #按UID排序 rows_by_uid = sorted(rows, key=itemgetter('uid')) #也支持按多个条件排序 rows_by_flname = sorted(rows, key=itemgetter('fname', lname'))
2. itemgetter在一般列表中的用法
>>> from operator import itemgetter >>> a = [10,20,30,40] >>> x = itemgetter(1) >>> x(a) 20 >>> y = itemgetter(1,0) >>> y(a) (20, 10)
3. itemgetter在元组中的用法,其中key为一个函数或者lambda函数,所以itemgetter可以用来当key的参数
>>> a = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)] #按第二个域和第三个域进行排序 >>> sorted(a, key=itemgetter(1,2)) [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)] #按第三个域方向排序 >>> sorted(a, key=itemgetter(2), reverse=True) [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
二. 使用itertools.groupby() :对字典中的某一个字段分组
rows = [ {'address': '5412 N CLARK', 'date': '07/01/2012'}, {'address': '5148 N CLARK', 'date': '07/04/2012'}, {'address': '5800 E 58TH', 'date': '07/02/2012'}, {'address': '2122 N CLARK', 'date': '07/03/2012'}, {'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'}, {'address': '1060 W ADDISON', 'date': '07/02/2012'}, {'address': '4801 N BROADWAY', 'date': '07/01/2012'}, {'address': '1039 W GRANVILLE', 'date': '07/04/2012'}, ] from operator import itemgetter from itertools import groupby # Sort by the desired field first rows.sort(key=itemgetter('date')) # Iterate in groups for date, items in groupby(rows, key=itemgetter('date')): print(date) for i in items: print(' ', i)
输出结果如下
07/01/2012 {'date': '07/01/2012', 'address': '5412 N CLARK'} {'date': '07/01/2012', 'address': '4801 N BROADWAY'} 07/02/2012 {'date': '07/02/2012', 'address': '5800 E 58TH'} {'date': '07/02/2012', 'address': '5645 N RAVENSWOOD'} {'date': '07/02/2012', 'address': '1060 W ADDISON'} 07/03/2012 {'date': '07/03/2012', 'address': '2122 N CLARK'} 07/04/2012 {'date': '07/04/2012', 'address': '5148 N CLARK'} {'date': '07/04/2012', 'address': '1039 W GRANVILLE'}
努力生活,融于自然