3 votes

Convertir une liste de Tuples de longueur variable en Dictionnaire

J'ai une liste de tuples de longueur variable. Comment puis-je la convertir en dictionnaire ?

tup = [ ("x", 1), ("x", 2, 4), ("x", 3), ("y", 1), ("y", 2), ("z", 1), ("z", 2, 3) ]  

J'obtiens l'erreur suivante lorsque j'utilise Comprehension

{key: [i[1:] for i in tup if i[0] == key] for (key, value) in tup}  

Erreur :

ValueError
Traceback (most recent call last)
>ipython-input-26-bedcc2e8a704< in module()
----> 1 {key: [i[1] for i in tuplex if i[0] == key] for (key, value) in tuplex}  
>ipython-input-26-bedcc2e8a704< in dictcomp((key, value))
----> 1 {key: [i[1] for i in tuplex if i[0] == key] for (key, value) in tuplex}  
ValueError: too many values to unpack

Sortie attendue :

{'x': [1, 2, 4, 3], 'y': [1, 2], 'z': [1, 2, 3]}

7voto

slider Points 2110

Cela ne semble pas être une tâche pour la compréhension d'une liste. Vous pouvez le faire avec un simple for en utilisant la boucle du dictionnaire setdefault pour définir la valeur par défaut d'une clé sur une liste vide et ensuite extend cette liste avec les valeurs de ce tuple :

tup = [ ("x", 1), ("x", 2, 4), ("x", 3), ("y", 1), ("y", 2), ("z", 1), ("z", 2, 3) ]

res = {}
for k, *rest in tup:
    res.setdefault(k, []).extend(rest)

print(res)
# {'y': [1, 2], 'x': [1, 2, 4, 3], 'z': [1, 2, 3]}

Pour Python 2.7, je ne pense pas que vous puissiez décompresser un tuple comme cela, donc vous pouvez essayer quelque chose comme :

for t in tup:
    res.setdefault(t[0], []).extend(t[1:])

0voto

simpson bart Points 63
tup = [("x", 1), ("x", 2, 4), ("x", 3), ("y", 1), ("y", 2), ("z", 1), ("z", 2, 3)]
data = {}
for item in tup:
    if item[0] in data:
        data[item[0]] = data[item[0]] + list(item[1:])
    else:
        data[item[0]] = list(item[1:])
print(data)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X