2016-08-08 1 views
0

私は性質prop1prop2と項目の一覧から、次のような構造を持つデータセットを生成しようとしています:私はできているO(n)の中で、リストから設定分類されたデータを生成する

result[p1][p2] => list of item with prop1=p1 and prop2=p2

でO(N2)でそれを行うには:

result = { 
    item.prop1: { 
     item.prop2: [ 
      i 
      for i in item_list 
      if i.prop1 == item.prop1 and i.prop2 == item.prop2 
     ] 
    } 
    for item in item_list 
} 

しかし、少ない時間でそれを行うための方法を見つけることができませんでした。 O(n)でこれを達成することは可能ですか?

答えて

2

あなたは一度だけのアイテムを反復している必要があります

from collections import defaultdict 

result = defaultdict(lambda: defaultdict(list)) 
for item in item_list: 
    result[item.prop1][item.prop2].append(item) 
+2

それはかなり動作しませんが。 'defaultdict(lambda:defaultdict(list))'を使う必要があります。あなたのバージョンでは 'result [item.prop1]'はリストになるので、 'result [item.prop1] [item.prop2]'にアクセスしようとすると失敗する可能性があります。 – BrenBarn

+0

あなたは絶対に正しいです - 私はそれが2次元マトリックスであることを見落としました。一定! – Karin

1

dictdefaultdictではなく)使用したソリューション:

result = {} 
for item in item_list: 
    result.setdefault(item.prop1, {}).setdefault(item.prop2, []).append(item) 
関連する問題