python-进阶教程-根据字段将记录分组

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)

猜你喜欢

转载自blog.csdn.net/qq_17753903/article/details/84932416