0.摘要
根据数据中某一元素对数据进行分类是常会遇到的问题,本文通过介绍itertool.groupby()函数,根据字典中某一个值把数据进行分类。
1.itertool.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 itertools import groupby
rows.sort(key=lambda r: r['date'])
for date, items in groupby(rows, key=lambda r: r['date']):
print(date)
for i in items:
print(' ', i)
'''
result:
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 ADDISON', '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'}
'''
原理:itertool.groupby()函数先扫描序列,找出拥有相同值或者由key指定的函数所返回的值,然后将它们分组。
返回值:itertool.groupby()函数创建一个迭代器,在每次迭代中返回一个值(value),一个子迭代器(sub_iterator)。子迭代器可以产生该分组内所有具有该值的项。
为什么先排序:itertool.groupby()函数只能检查连续的项!
2.不排序实现分组
由于itertool.groupby()函数需要先进行排序,这在排序复杂度较高的数据中可能会成为一项阻碍,那么可以考虑使用多值字典。
多值字典的相关内容请各位读者移步:https://blog.csdn.net/qq_17753903/article/details/83989377
from collections import defaultdict
rows_by_date = defaultdict(list)
for row in rows:
rows_by_date[row['date']].append(row)
for r in rows_by_date['07/01/2012']:
print(r)
#result:
# {'address': '5412 N CLARK', 'date': '07/01/2012'}
# {'address': '4801 N BROADWAY', 'date': '07/01/2012'}
from pprint import pprint
pprint(rows_by_date)