首頁  >  文章  >  後端開發  >  Python如何利用itertools.groupby() 根據欄位將記錄分組

Python如何利用itertools.groupby() 根據欄位將記錄分組

不言
不言轉載
2018-10-22 17:17:592659瀏覽
這篇文章帶給大家的內容是關於Python如何利用itertools.groupby() 根據欄位將記錄分組,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

1、需求

有一系列的字典或物件實例,我們想要根據某個特定的欄位來分組迭代資料。

2、解決方案

itertools.groupby()函數在資料分組時特別有用。

實例:

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)

結果:

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'}

#3、分析

python實作一鍵多值字典的方法實作

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

在這裡重要的是首先要根據age對資料進行排序。因為groupby()不會排序。

如果只是簡單的根據日期將資料分組到一起,放進一個大的資料結構中以允許進行隨機訪問,那麼利用defaultdict()建立一個一鍵多值字典可能會更好:

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如何利用itertools.groupby() 根據欄位將記錄分組的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除