需求: 当前有个字典实例,你想以某个字段比如”日期”对整个字典里面的元素进行分组。
方法: itertools.groupby()函数是专门用来干这个活的。请看下面这个例子,这里有一个列表构成的字典,你想按照日期来对列表进行分组,可以这么做:
In [42]: from operator import itemgetter
In [43]: from itertools import groupby
In [44]: 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 ADDISION', 'date' : '07/02/2012'}, ...: {'address' : '4801 N BROADWAY', 'date' : '07/01/2012'}, ...: {'address' : '1039 W GRANVILLE', 'date' : '07/04/2012'} ...: ]
In [45]: rows.sort(key=itemgetter('date'))
In [46]: for date, items in groupby(rows, key=itemgetter('date')): ...: print(date) ...: for i in items: ...: print(' ', i) ...: 07/01/2012 {'address': '5412 N CLARK', 'date': '07/01/2012'} {'address': '4801 N BROADWAY', 'date': '07/01/2012'}07/02/2012 {'address': '5800 E 58TH', 'date': '07/02/2012'} {'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'} {'address': '1060 W ADDISION', 'date': '07/02/2012'}07/03/2012 {'address': '2122 N CLARK', 'date': '07/03/2012'}07/04/2012 {'address': '5148 N CLARK', 'date': '07/04/2012'} {'address': '1039 W GRANVILLE', 'date': '07/04/2012'}1234567891011121314151617181920212223242526272829303132333435扩展: 实用groupby()函数前,必须对相应的要分组的字段进行排序,因为他只能对有序数据进行分组。如果你仅仅只是想针对日期进行分组并且允许随机获取,那可能更好的方法是实用defaultdict()先产生一个多维字典,例如:
In [48]: from collections import defaultdict
In [49]: rows_by_date = defaultdict(list)
In [50]: for row in rows: ...: rows_by_date[row['date']].append(row) ...:
In [51]: for r in rows_by_date['07/01/2012']: ...: print(r) ...: {'address': '5412 N CLARK', 'date': '07/01/2012'}{'address': '4801 N BROADWAY', 'date': '07/01/2012'}对于这个例子,并不需要先对记录进行排序。因此如果不需要考虑内存,用这个方法比用groupby()要快得多。————————————————
转载于:https://www.cnblogs.com/valorchang/p/11475540.html