python-進階教程-根據欄位將記錄分組
阿新 • • 發佈:2018-12-18
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)