Python實用技法第14篇:根據字段將記錄分組:itertools.groupby()

上一篇文章: Python實用技法第13篇:對自定義類對象排序:attrgetter
下一篇文章: Python實用技法第15篇:篩選序列中的元素

一、需求🙀

有一系列的字典或對象實例,咱們想根據某個特定的字段來分組迭代數據。

二、解決方案😸

itertools.groupby()函數在對數據進行分組時特別有用。segmentfault

實例:數據結構

from operator import itemgetter
from itertools import groupby

rows=[
    {'name':'mark','age':18,'uid':'110'},
    {'name':'miaomiao','age':28,'uid':'160'},
    {'name':'miaomiao2','age':28,'uid':'150'},
    {'name':'xiaohei','age':38,'uid':'130'},
]

#首先根據age排序
rows.sort(key=itemgetter('age'))

for age,items in groupby(rows,key=itemgetter('age')):
    print(age)
    for i in items:
        print(i)

結果:app

18
{'name': 'mark', 'age': 18, 'uid': '110'}
28
{'name': 'miaomiao', 'age': 28, 'uid': '160'}
{'name': 'miaomiao2', 'age': 28, 'uid': '150'}
38
{'name': 'xiaohei', 'age': 38, 'uid': '130'}

三、分析

Python實用技法第5篇:一鍵多值字典:defaultdict

函數groupby()經過掃描序列找出擁有相同值(或是由參數key指定的函數所返回的值)的序列項,並將它們分組。groupby()建立了一個迭代器,而在每次迭代時都會返回一個值(value)和一個子迭代器(sub_iterator),這個迭代器能夠產生全部在該分組內具備該值得項。函數

在這裏重要的是首先要根據age對數據進行排序。由於groupby()不會排序。ui

若是隻是簡單的根據日期將數據分組到一塊兒,放進一個大的數據結構中以容許進行隨機訪問,那麼利用defaultdict()構建一個一鍵多值字典可能會更好:code

from collections import defaultdict

rows=[
    {'name':'mark','age':18,'uid':'110'},
    {'name':'miaomiao','age':28,'uid':'160'},
    {'name':'miaomiao2','age':28,'uid':'150'},
    {'name':'xiaohei','age':38,'uid':'130'},
]

rows_by_age=defaultdict(list)
for row in rows:
    rows_by_age[row['age']].append(row)
for a in rows_by_age[28]:
    print(a)

結果:對象

{'name': 'miaomiao', 'age': 28, 'uid': '160'}
{'name': 'miaomiao2', 'age': 28, 'uid': '150'}

不考慮排序的話,defaultdict方法通常比groupby快。排序

上一篇文章: Python實用技法第13篇:對自定義類對象排序:attrgetter
下一篇文章: Python實用技法第15篇:篩選序列中的元素
相關文章
相關標籤/搜索