2016-03-10 2 views
0

Maintenant, j'ai un dictionnaire,Comment aplatir un dictionnaire en un tuple de deux listes?

{2.9: [0.66], 3.3: [0.82, 0.48]} 

et je veux aplatir un tuple composé de deux listes:

([3.3, 3.3, 2.9], [0.82, 0.48, 0.66]) 

3.3 apparaît deux fois parce qu'il y avait deux éléments dans l'entrée du dictionnaire correspondante.

Comment faire?

+0

D'où vient le second 3.3? – timgeb

+0

Il y a deux éléments dans la liste correspondant à 3.3, donc chacun des éléments doit correspondre à 3.3 dans le tuple aplati. – Febday

+0

Il l'agrandit. Alors pensez: {2.9: 0.66, 3.3: 0.82, 3.3: 0.48} '(si cela était possible) – Goodies

Répondre

6

Si tuple de tuples est ok, il est un peu plus simple

>>> D = {2.9: [0.66], 3.3: [0.82, 0.48]} 
>>> tuple(zip(*((k, v) for k in D for v in D[k]))) 
((3.3, 3.3, 2.9), (0.82, 0.48, 0.66)) 

Si vous avez vraiment besoin des listes

>>> tuple(map(list, zip(*((k, v) for k in D for v in D[k])))) 
([3.3, 3.3, 2.9], [0.82, 0.48, 0.66]) 

Ma variation de @ Steven et @ réponses de Padraic. (J'éviter d'utiliser dict.items parce que son comportement est si différent entre python2 et python3)

keys, vals = result = [], [] 
for k in D: 
    v = D[k] 
    vals += v 
    keys += [k] * len(v) 
print(result) 
2
>>> d = {2.9: [0.66], 3.3: [0.82, 0.48]} 

D'abord nous allons distribuer les deux clés du dictionnaire dans une liste de tuples:

>>> ts = [(k, x) for k, l in d.items() for x in l] 
>>> ts 
[(3.3, 0.82), (3.3, 0.48), (2.9, 0.66)] 

Je m utiliser une compréhension de liste à deux niveaux, qui est le sucre syntaxique pour la boucle imbriquée équivalente.

Ensuite, vous pouvez transpose the list.

>>> result = zip(*ts) 
>>> list(result) 
[(3.3, 3.3, 2.9), (0.82, 0.48, 0.66)] 

Ou comme une seule expression, en utilisant une expression de générateur paresseux au lieu d'une compréhension de la liste:

result = zip(*((k, x) for k, l in d.items() for x in l)) 
+0

Minor nit: OP veut un tuple de listes, pas une liste de tuples. –

+0

Je suis d'avis que ça ne dérange pas OP que ce soit un tuple ou une liste :) –

1

La meilleure réponse est une doublure de John La Rooy en utilisant map, zip, et une expression de générateur . Voici un autre simpliste:

d = {2.9: [0.66], 3.3: [0.82, 0.48]} 

keys, vals = result = [], [] 
for k in d: 
    for v in d[k]: 
     keys.append(k) 
     vals.append(v) 
+0

J'aime celui-ci mieux que le mien - et c'est probablement aussi plus rapide –

2

Une variante de Stevens réponse à l'aide étendre par opposition à ajouter que les clés de dict sont immuables il est sûr de simplement multiplier.

d = {2.9: [0.66], 3.3: [0.82, 0.48]} 

keys, vals = result = [], [] 
for k, v in d.items(): 
    vals.extend(v) 
    keys.extend([k] * len(v))