2017-04-05 5 views
16

ich erstellen versuchen dict durch verschachtelte list:Verschachtelte Liste dict

groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']] 

L = [{y:x[0] for y in x if y != x[0]} for x in groups] 
d = { k: v for d in L for k, v in d.items()} 

print (d) 
{'B': 'Group1', 'C': 'Group2', 'D': 'Group2', 'A': 'Group1'} 

Aber es scheint ein wenig kompliziert.

Gibt es eine bessere Lösung?

+11

Ich sehe, was Sie dort taten :) http://stackoverflow.com/a/43227053/5811078 – zipa

Antwort

18

Was:

d = {k:row[0] for row in groups for k in row[1:]} 

Das gibt:

>>> {k:row[0] for row in groups for k in row[1:]} 
{'D': 'Group2', 'B': 'Group1', 'C': 'Group2', 'A': 'Group1'} 

So iterieren Sie über jeder row im groups. Das erste Element der Zeile wird als Wert genommen (row[0]) und Sie durchlaufen über row[1:], um alle Schlüssel k zu erhalten.

Seltsam, wie es scheinen mag, funktioniert dieser Ausdruck auch, wenn Sie es eine leere Zeile geben (wie groups = [[],['A','B']]). Das ist, weil row[1:] leer sein wird und damit der row[0] Teil ist nie ausgewertet:

>>> groups = [[],['A','B']] 
>>> {k:row[0] for row in groups for k in row[1:]} 
{'B': 'A'} 
6

Ich denke, eine Linie Lösung ein wenig Verwirrung. Ich würde Code wie schreiben unter

groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']] 

result = {} 
for group in groups: 
    for item in group[1:]: 
     result[item] = group[0] 
print result 
+0

viel besser. Meistens sind 1-Linien-Lösungen nur um Cleverness zu präsentieren – Jagannath

8

Dies ist im Wesentlichen eine hübschere Version von Willems:

>>> groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']] 
>>> {k:g for g,*tail in groups for k in tail} 
{'B': 'Group1', 'A': 'Group1', 'C': 'Group2', 'D': 'Group2'} 

Aber es wird nicht mit einer leeren Liste arbeiten: groups = [[],['A','B']]

>>> {k:head for head, *tail in grps for k in tail} 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 1, in <dictcomp> 
ValueError: not enough values to unpack (expected at least 1, got 0) 
4

ich auch wie Willems Lösung, aber nur der Vollständigkeit halber ...

eine weitere Variante mit itertool s und eine Generatorfunktion (Python 3.x nur)

def pairs(groups): 
    for value,*keys in groups: 
     for key_value in zip(keys, itertools.repeat(value)): 
      yield key_value 

dict(pairs(groups)) 
{'A': 'Group1', 'B': 'Group1', 'C': 'Group2', 'D': 'Group2'} 
Verwandte Themen