25

私はこのデータを持っています:

self.data = [(1, 1, 5.0),
             (1, 2, 3.0),
             (1, 3, 4.0),
             (2, 1, 4.0),
             (2, 2, 2.0)]

このコードを実行すると:

for mid, group in itertools.groupby(self.data, key=operator.itemgetter(0)):

私が得るためlist(group)に:

[(1, 1, 5.0),
 (1, 2, 3.0),
 (1, 3, 4.0)]

それが私が欲しいものです。

しかし、0ではなく1を使用すると

for mid, group in itertools.groupby(self.data, key=operator.itemgetter(1)):

タプルの2番目の番号でグループ化すると、次のようになります。

[(1, 1, 5.0)]

その1(2番目)の位置に「1」がある他のタプルがありますが。

4

3 に答える 3

44

itertools.groupbyは、同じキーを持つ連続したアイテムをまとめます。同じキーを持つすべてのアイテムが必要な場合は、self.data最初に並べ替える必要があります。

for mid, group in itertools.groupby(
    sorted(self.data,key=operator.itemgetter(1)), key=operator.itemgetter(1)):
于 2011-11-14T02:30:49.960 に答える
30

ソートなしのバリアント (辞書経由)。パフォーマンス的にはより良いはずです。

def full_group_by(l, key=lambda x: x):
    d = defaultdict(list)
    for item in l:
        d[key(item)].append(item)
    return d.items()
于 2013-03-06T14:37:54.933 に答える