《Python Cookbook 3rd》笔记(1.15):通过某个字段将记录分组
通過某個字段將記錄分組
問題
你有一個字典或者實例的序列,然后你想根據某個特定的字段比如 date 來分組迭代訪問。
解法
itertools.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'}, ]現在假設你想在按 date 分組后的數據塊上進行迭代。為了這樣做,你首先需要按照指定的字段 (這里就是 date ) 排序(排序是必須的),然后調用 itertools.groupby() 函數:
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)運行結果:
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() 函數掃描整個序列并且查找連續相同值 (或者根據指定 key 函數返回值相同) 的元素序列。在每次迭代的時候,它會返回一個值和一個迭代器對象,這個迭代器對象可以生成元素值全部等于上面那個值的組中所有對象。
一個非常重要的準備步驟是要根據指定的字段將數據排序。因為 groupby() 僅僅檢查連續的元素,如果事先并沒有排序完成的話,分組函數將得不到想要的結果。
如果你僅僅只是想根據 date 字段將數據分組到一個大的數據結構中去,并且允許
隨機訪問,那么你最好使用 defaultdict() 來構建一個多值字典,關于多值字典已經
在 1.6 小節有過詳細的介紹。比如:
這樣的話你可以很輕松的就能對每個指定日期訪問對應的記錄:
>>> 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'} >>>在上面這個例子中,我們沒有必要先將記錄排序。因此,如果對內存占用不是很關心,這種方式會比先排序然后再通過 groupby() 函數迭代的方式運行得快一些。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的《Python Cookbook 3rd》笔记(1.15):通过某个字段将记录分组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习问题总结(03)
- 下一篇: 《Python Cookbook 3rd