2017-07-21 1 views
7

je dict des emboîtés list s:Convertir dict de listes imbriquées à la liste des tuples

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)]]} 

Je dois créer list de tuple s comme:

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

J'ai essayé:

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

Je pense que ma solution est un peu trop compliquée. Y a-t-il une solution meilleure, plus pythonique, peut-être une ligne?

Répondre

16

Vous étiez presque là:

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

Le v[0] est nécessaire parce que vos valeurs ne sont que des listes à un seul élément avec une autre liste contenue. Ce qui précède peut être étendu aux boucles imbriquées for suivantes, si vous voulez savoir ce qu'il fait:

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

Démo:

>>> 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 ...' fonctionnerait aussi –

+1

@ Ev.Kounis: non ce n'est pas le cas, 'v' n'est pas un tuple. –

+1

@ Ev.Kounis: et je trouve '(k, * t)' plus net que '(k,) + t'. –

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

ce qui est 'list'? et cela ne fonctionne pas .. –

+3

Vous ne pouvez pas concaténer des chaînes et des tuples (clés et les valeurs imbriquées). –

+0

'TypeError: Impossible de convertir l'objet 'list' en str implicitement' – Arount