2017-07-21 107 views
7

mam dict zagnieżdżonych list s:Konwersja DICT zagnieżdżonych list do listy krotek

d = {'a': [[('a1', 1, 1), ('a2', 1, 2)]], 'b': [[('b1', 2, 1), ('b2', 2, 2)]]} 
print (d) 
{'b': [[('b1', 2, 1), ('b2', 2, 2)]], 'a': [[('a1', 1, 1), ('a2', 1, 2)]]} 

muszę tworzyć list z tuple s jak:

[('b', 'b1', 2, 1), ('b', 'b2', 2, 2), ('a', 'a1', 1, 1), ('a', 'a2', 1, 2)] 

Próbowałem:

a = [[(k, *y) for y in v[0]] for k,v in d.items()] 
a = [item for sublist in a for item in sublist] 

Myślę, że moje rozwiązanie jest nieco zbyt skomplikowane. Czy jest jakieś lepsze, bardziej pytonowe, może jedno liniowe rozwiązanie?

Odpowiedz

16

Byłaś prawie tam:

[(k, *t) for k, v in d.items() for t in v[0]] 

v[0] jest potrzebna, ponieważ Twoje wartości są tylko listy pojedynczego elementu z innej listy zawarte. Powyższe może być rozszerzona do następujących zagnieżdżonych for pętli, jeśli chcesz dowiedzieć się, co robi:

for key, value in d.items(): # value is [[(...), (...), ...]] 
    for tup in value[0]: # each (...) from value[0] 
     (key, *tup) # produce a new tuple 

Demo:

>>> d = {'a': [[('a1', 1, 1), ('a2', 1, 2)]], 'b': [[('b1', 2, 1), ('b2', 2, 2)]]} 
>>> [(k, *t) for k, v in d.items() for t in v[0]] 
[('a', 'a1', 1, 1), ('a', 'a2', 1, 2), ('b', 'b1', 2, 1), ('b', 'b2', 2, 2)] 
+0

'[(k,) + v ...' również działałby –

+1

@ Ev.Kounis: nie, nie, 'v' nie jest krotką. –

+1

@ Ev.Kounis: i uważam '(k, * t)' za schludniejszy niż '(k,) + t'. –

-5
a = [(k,) + v for k,vs in d.items() for v in vs] 
+3

co jest 'list'? i to nie działa. –

+3

Nie można łączyć łańcuchów i krotek (klawiszy i zagnieżdżonych wartości). –

+0

'TypeError: Nie można przekonwertować 'list' obiektu na str. Niejawnie' – Arount