from collections import defaultdict
import itertools
items = [(0, 0), (0, 1), (1, 0), (1, 1)]
keyfunc = lambda x: x[0]
# Grouping yourself
item_map = defaultdict(list)
for item in items:
item_map[keyfunc(item)].append(item)
# Using itertools.groupby
item_map = {}
for key, group in itertools.groupby(items, keyfunc):
item_map[key] = [i for i in group]
itertools.groupby
について、私はそれを自分で行うのではなく、どうすればいいのですか?時間の複雑さを減らしてグループ化を実行できますか?または、私のユースケースでポイントを逃していますか?groupby
を他のケースで使用する必要がありますか?あなた自身ではなくitertools.groupbyを使用するのはなぜですか?
は別のポスターは、項目が(またはキーが互いに連続しているというだけのこと)キーでソートされていないグループ化する場合itertools.groupby
は異なる結果を返すことを述べました。 items = [(0, 0), (1, 1), (0, 2)]
と例えば
、私はそれは、ポイントを考え誤解していない限り、私の実装は
{0: [(0, 0), (0, 2)], 1: [(1, 1)]}
を返すのに対し、我々は、キーにitertools.groupby
戻り
{0: [(0, 2)], 1: [(1, 1)]}
をソートしていない場合DIYメソッドはデータをソートする必要がないため、DIYメソッドが優れているようです。ここで
はdocumentationです:
のiterableからの連続したキーとグループを返すイテレータを作成します。キーは、各要素のキー値を計算する関数です。指定されていない場合、またはNoneの場合、keyのデフォルトはID関数になり、要素は変更されません。一般に、イテラブルは同じキー関数で既にソートされている必要があります。