2016-08-08 57 views
0

Ich versuche, einen Datensatz mit folgenden Struktur aus einer Liste von Elementen mit Eigenschaften prop1 und prop2 zu generieren:kategorisierten Daten generieren aus der Liste in O (n) gesetzt

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

ich in der Lage gewesen, zu tun es in O (n2) mit:

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 
} 

aber habe es nicht in weniger Zeit zu tun in der Lage, einen Weg zu finden. Ist es möglich, dies in O (n) zu erreichen?

Antwort

2

Sie sollten nur einmal über die Elemente iterieren haben:

from collections import defaultdict 

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

Das wird nicht ganz funktioniert. Sie müssen 'defaultdict (lambda: defaultdict (list))' verwenden. In Ihrer Version wird 'result [item.prop1]' eine Liste sein, daher wird der Versuch, auf 'result [item.prop1] [item.prop2] '' zuzugreifen, wahrscheinlich fehlschlagen. – BrenBarn

+0

Sie haben absolut Recht - ich habe übersehen, dass es eine 2d-Matrix war. Fest! – Karin

1

Eine Lösung mit einem dict (im Gegensatz zu einem defaultdict gegen):

result = {} 
for item in item_list: 
    result.setdefault(item.prop1, {}).setdefault(item.prop2, []).append(item)