python-進階教程-根據欄位將記錄分組

shangyj17發表於2018-12-09

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)

 

相關文章