《Python Cookbook 3rd》笔记(1.15):通过某个字段将记录分组
通過(guò)某個(gè)字段將記錄分組
問(wèn)題
你有一個(gè)字典或者實(shí)例的序列,然后你想根據(jù)某個(gè)特定的字段比如 date 來(lái)分組迭代訪問(wèn)。
解法
itertools.groupby() 函數(shù)對(duì)于這樣的數(shù)據(jù)分組操作非常實(shí)用。為了演示,假設(shè)你已經(jīng)有了下列的字典列表:
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'}, ]現(xiàn)在假設(shè)你想在按 date 分組后的數(shù)據(jù)塊上進(jìn)行迭代。為了這樣做,你首先需要按照指定的字段 (這里就是 date ) 排序(排序是必須的),然后調(diào)用 itertools.groupby() 函數(shù):
from operator import itemgetter from itertools import groupby# Sort by the desired field first rows.sort(key=itemgetter('date')) # Iterate in groups for date, items in groupby(rows, key=itemgetter('date')):print(date)for i in items:print(' ', i)運(yùn)行結(jié)果:
07/01/2012{'date': '07/01/2012', 'address': '5412 N CLARK'}{'date': '07/01/2012', 'address': '4801 N BROADWAY'} 07/02/2012{'date': '07/02/2012', 'address': '5800 E 58TH'}{'date': '07/02/2012', 'address': '5645 N RAVENSWOOD'}{'date': '07/02/2012', 'address': '1060 W ADDISON'} 07/03/2012 {'date': '07/03/2012', 'address': '2122 N CLARK'} 07/04/2012{'date': '07/04/2012', 'address': '5148 N CLARK'}{'date': '07/04/2012', 'address': '1039 W GRANVILLE'}討論
groupby() 函數(shù)掃描整個(gè)序列并且查找連續(xù)相同值 (或者根據(jù)指定 key 函數(shù)返回值相同) 的元素序列。在每次迭代的時(shí)候,它會(huì)返回一個(gè)值和一個(gè)迭代器對(duì)象,這個(gè)迭代器對(duì)象可以生成元素值全部等于上面那個(gè)值的組中所有對(duì)象。
一個(gè)非常重要的準(zhǔn)備步驟是要根據(jù)指定的字段將數(shù)據(jù)排序。因?yàn)?groupby() 僅僅檢查連續(xù)的元素,如果事先并沒有排序完成的話,分組函數(shù)將得不到想要的結(jié)果。
如果你僅僅只是想根據(jù) date 字段將數(shù)據(jù)分組到一個(gè)大的數(shù)據(jù)結(jié)構(gòu)中去,并且允許
隨機(jī)訪問(wèn),那么你最好使用 defaultdict() 來(lái)構(gòu)建一個(gè)多值字典,關(guān)于多值字典已經(jīng)
在 1.6 小節(jié)有過(guò)詳細(xì)的介紹。比如:
這樣的話你可以很輕松的就能對(duì)每個(gè)指定日期訪問(wèn)對(duì)應(yīng)的記錄:
>>> for r in rows_by_date['07/01/2012']: ... print(r) ... {'date': '07/01/2012', 'address': '5412 N CLARK'} {'date': '07/01/2012', 'address': '4801 N BROADWAY'} >>>在上面這個(gè)例子中,我們沒有必要先將記錄排序。因此,如果對(duì)內(nèi)存占用不是很關(guān)心,這種方式會(huì)比先排序然后再通過(guò) groupby() 函數(shù)迭代的方式運(yùn)行得快一些。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的《Python Cookbook 3rd》笔记(1.15):通过某个字段将记录分组的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 机器学习问题总结(03)
- 下一篇: 《Python Cookbook 3rd