サーチ…


前書き

Pythonでは、 itertools.groupby()メソッドを使用すると、開発者は、指定されたプロパティに基づいて反復可能なクラスの値を別の反復可能な値のセットにグループ化できます。

構文

  • itertools.groupby(iterable、key = Noneまたはsome function)

パラメーター

パラメータ詳細
繰り返し可能な任意のpython iterable
キーイテラブルをグループ化する機能(基準)

備考

groupby()は扱いにくいですが、使用時に注意するべき一般的なルールは次のとおりです。

グループ化に使用するキーと同じキーを使用して、グループ化するアイテムを常に並べ替えます

読者がここの文書を見て、クラス定義を使ってどのように説明されているかを参照することをお勧めします。

例1

あなたは文字列を持っていると言う

s = 'AAAABBBCCDAABBB'

あなたはそれを分割して、すべての 'A'が1つのリストに入っているので、すべての 'B'と 'C'などで、このようなことをすることができます

s = 'AAAABBBCCDAABBB'
s_dict = {}
for i in s:
    if i not in s_dict.keys():
        s_dict[i] = [i]
    else:
        s_dict[i].append(i)
s_dict

結果は

{'A': ['A', 'A', 'A', 'A', 'A', 'A'],
 'B': ['B', 'B', 'B', 'B', 'B', 'B'],
 'C': ['C', 'C'],
 'D': ['D']}

しかし、大きなデータセットの場合、これらのアイテムをメモリに蓄積しています。これは、groupby()が入る場所です

次のようにすることで、より効率的な方法で同じ結果を得ることができました

# note that we get a {key : value} pair for iterating over the items just like in python dictionary
from itertools import groupby
s = 'AAAABBBCCDAABBB'
c = groupby(s)

dic = {} 
for k, v in c:
    dic[k] = list(v)
dic

結果は

{'A': ['A', 'A'], 'B': ['B', 'B', 'B'], 'C': ['C', 'C'], 'D': ['D']}

group byを使用したときの結果の「A」の数は、元の文字列の「A」の実際の数よりも少ないことに注意してください。以下のように、s内の項目をソートしてからcに渡すことで情報が失われるのを防ぐことができます

c = groupby(sorted(s))

dic = {} 
for k, v in c:
    dic[k] = list(v)
dic

結果は

{'A': ['A', 'A', 'A', 'A', 'A', 'A'], 'B': ['B', 'B', 'B', 'B', 'B', 'B'], 'C': ['C', 'C'], 'D': ['D']}

今私たちはすべてのAを持っています。

例2

この例では、何も指定しなかった場合のデフォルトのキーの選択方法を示します。

c = groupby(['goat', 'dog', 'cow', 1, 1, 2, 3, 11, 10, ('persons', 'man', 'woman')])
dic = {}
for k, v in c:
    dic[k] = list(v)
dic

結果は

{1: [1, 1],
 2: [2],
 3: [3],
 ('persons', 'man', 'woman'): [('persons', 'man', 'woman')],
 'cow': ['cow'],
 'dog': ['dog'],
 10: [10],
 11: [11],
 'goat': ['goat']}

タプル全体がこのリストの1つのキーとしてカウントされることに注目してください

例3

この例では、mulatoとcamelが結果に表示されないことに注意してください。指定されたキーを持つ最後の要素のみが表示されます。 cの最後の結果は、2つの以前の結果を実際に消去します。しかし、同じバージョンのキーで最初にソートされたデータがある新しいバージョンを見てください。

list_things = ['goat', 'dog', 'donkey', 'mulato', 'cow', 'cat', ('persons', 'man', 'woman'), \
               'wombat', 'mongoose', 'malloo', 'camel']
c = groupby(list_things, key=lambda x: x[0])
dic = {}
for k, v in c:
    dic[k] = list(v)
dic

結果は

{'c': ['camel'],
 'd': ['dog', 'donkey'],
 'g': ['goat'],
 'm': ['mongoose', 'malloo'],
 'persons': [('persons', 'man', 'woman')],
 'w': ['wombat']}

ソート済みバージョン

list_things = ['goat', 'dog', 'donkey', 'mulato', 'cow', 'cat', ('persons', 'man', 'woman'), \
               'wombat', 'mongoose', 'malloo', 'camel']
sorted_list = sorted(list_things, key = lambda x: x[0])
print(sorted_list)
print()
c = groupby(sorted_list, key=lambda x: x[0])
dic = {}
for k, v in c:
    dic[k] = list(v)
dic

結果は

['cow', 'cat', 'camel', 'dog', 'donkey', 'goat', 'mulato', 'mongoose', 'malloo', ('persons', 'man', 'woman'), 'wombat']

{'c': ['cow', 'cat', 'camel'],
 'd': ['dog', 'donkey'],
 'g': ['goat'],
 'm': ['mulato', 'mongoose', 'malloo'],
 'persons': [('persons', 'man', 'woman')],
 'w': ['wombat']}

例4

この例では、異なるタイプの繰り返し可能性を使用するときに何が起こるかを示しています。

things = [("animal", "bear"), ("animal", "duck"), ("plant", "cactus"), ("vehicle", "harley"), \
          ("vehicle", "speed boat"), ("vehicle", "school bus")]
dic = {}
f = lambda x: x[0]
for key, group in groupby(sorted(things, key=f), f):
    dic[key] = list(group)
dic

結果は

{'animal': [('animal', 'bear'), ('animal', 'duck')],
 'plant': [('plant', 'cactus')],
 'vehicle': [('vehicle', 'harley'),
  ('vehicle', 'speed boat'),
  ('vehicle', 'school bus')]}

以下の例は、基本的にはそれと同じです。唯一の違いは、すべてのタプルをリストに変更したことです。

things = [["animal", "bear"], ["animal", "duck"], ["vehicle", "harley"], ["plant", "cactus"], \
          ["vehicle", "speed boat"], ["vehicle", "school bus"]]
dic = {}
f = lambda x: x[0]
for key, group in groupby(sorted(things, key=f), f):
    dic[key] = list(group)
dic

結果

{'animal': [['animal', 'bear'], ['animal', 'duck']],
 'plant': [['plant', 'cactus']],
 'vehicle': [['vehicle', 'harley'],
  ['vehicle', 'speed boat'],
  ['vehicle', 'school bus']]}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow