ホームページ >バックエンド開発 >Python チュートリアル >Python が itertools.groupby() を使用してフィールドに従ってレコードをグループ化する方法

Python が itertools.groupby() を使用してフィールドに従ってレコードをグループ化する方法

不言
不言転載
2018-10-22 17:17:592696ブラウズ
この記事の内容は、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() は、シーケンスをスキャンして同じ値 (またはパラメーター キーで指定された関数によって返された値) を持つシーケンス項目を見つけ、それらをグループ化します。 groupby() は反復子を作成し、各反復子は値と sub_iterator を返します。この反復子は、グループ内のその値を持つすべての項目を生成できます。

ここで重要なのは、まず年齢に基づいてデータを並べ替えることです。 groupby() はソートしないためです。

単純にデータを日付に基づいてグループ化し、ランダム アクセスを可能にする大規模なデータ構造に入れる場合は、defaultdict() を使用して 1 キーの複数値の辞書を構築する方が良い場合があります。

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。