2016-09-25 7 views
2
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関数になり、要素は変更されません。一般に、イテラブルは同じキー関数で既にソートされている必要があります。

答えて

2

一般的にイテレータを使用することは、データセット全体をメモリに保存しないようにすることです。あなたの例では、それは重要ではありません:

  • 入力はすでにすべてメモリにあります。
  • dictにすべてをダンプするだけで、出力もすべてメモリに保存されます。

それとも、私は私のユースケースにポイントをしないのです、とGROUPBYは、他のケースのために使用すべきですか?

私はそれが正確な評価だと思います。

for key, group in itertools.groupby(items, keyfunc): 
    print("{}: {}".format(key, str([i for i in group]))) 

今では少なくなります。

と仮定items(例えば者は、それが標準入力から読み込まれる行だとしましょう)と出力は、メモリ内のデータ構造以外のもの(例えば標準出力)でイテレータですあなた自身でそれをするのは簡単です。

関連する問題