Comment convertir une liste de tuples clé-valeur en dictionnaire?

125

J'ai une liste qui ressemble à:

[('A', 1), ('B', 2), ('C', 3)]

Je veux en faire un dictionnaire qui ressemble à:

{'A': 1, 'B': 2, 'C': 3}

Quelle est la meilleure façon de procéder?

EDIT: Ma liste de tuples est en fait plus comme:

[(A, 12937012397), (BERA, 2034927830), (CE, 2349057340)]
Fred Wilson
la source
1
Quels types d'entités sont-ils A, B(ou BERA) et C(ou CE) vraiment? Merci
manger le
Je suis prêt à parier que les erreurs produites avec les exemples de travail ci-dessous sont liées au fait qu'il n'a pas de liste de tuples, mais une liste extrêmement longue qu'il veut séparée en 2-tuples.
gddc

Réponses:

90

Cela me donne la même erreur que d'essayer de diviser la liste et de la compresser. ValueError: l'élément de séquence de mise à jour du dictionnaire # 0 a une longueur de 1916; 2 est requis

TELLE est votre vraie question.

La réponse est que les éléments de votre liste ne sont pas ce que vous pensez qu'ils sont. Si vous tapez, myList[0]vous constaterez que le premier élément de votre liste n'est pas un deux-tuple, par exemple ('A', 1), mais plutôt un itérable de longueur 1916.

Une fois que vous avez réellement une liste sous la forme que vous avez indiquée dans votre question initiale ( myList = [('A',1),('B',2),...]), tout ce que vous avez à faire estdict(myList) .

ninjagecko
la source
Merci, je ne sais pas comment la liste est arrivée, mais après l'avoir retravaillée à partir de zéro, j'ai pu la réparer.
Fred Wilson
1
@DJ_Stuffy_K: (en supposant que le contexte n'est pas lié à cette question) En général, à moins que cela ne soit superflu ou ne ralentisse votre programme, il est parfaitement bien de créer des dictionnaires comme index utiles dans n'importe quelle structure de données abstraite que vous construisez implicitement. La notion de «bonne pratique» dépend entièrement du contexte; avez-vous besoin du temps de recherche O (1) pour les clés? Vous ne pouvez pas non plus «convertir des listes en dictionnaires» de manière arbitraire; cela dépend entièrement de la sémantique. par exemple [(1,2), (1,3)]-> {1:3}clobberait vos clés et perdrait des informations! Un dict est une relation un-à-* avec un temps d'insertion / suppression O (1). La liste est une liste.
ninjagecko
162
>>> dict([('A', 1), ('B', 2), ('C', 3)])
{'A': 1, 'C': 3, 'B': 2}
Andreas Jung
la source
5
A également commenté une autre réponse qui suggère la même chose: cela ne couvre pas le fait d'avoir des «clés» de tuple en double, par exemple: l=[('A',1), ('B',2), ('C',3), ('A', 2)]cela entraînera 'A': 1ce qui peut ne pas être le résultat souhaité.
guival
32

Avez-vous essayé cela?

>>> l=[('A',1), ('B',2), ('C',3)]
>>> d=dict(l)
>>> d
{'A': 1, 'C': 3, 'B': 2}
Inutile
la source
ValueError: l'élément de séquence de mise à jour du dictionnaire # 0 a une longueur de 1916; 2 est requis
Fred Wilson
C'était un simple cut'n'paste de mon terminal, donc ça devrait marcher. Pouvez-vous montrer exactement ce que vous avez fait pour obtenir cette erreur?
Inutile du
@Fred, vous devez avoir mal saisi quelque chose, cette réponse est très bien.
martineau
@FredWilson c'est l'erreur que vous obtenez habituellement lorsque vous essayez quelque chose commedict([string1, string2, string3, string4])
chacham15
2
Cela ne couvre pas le fait d'avoir des «clés» de tuple en double, par exemple: l=[('A',1), ('B',2), ('C',3), ('A', 2)]cela entraînera 'A': 1ce qui peut ne pas être le résultat souhaité.
guival
10

Voici un moyen de gérer les "clés" de tuple en double:

# An example
l = [('A', 1), ('B', 2), ('C', 3), ('A', 5), ('D', 0), ('D', 9)]

# A solution
d = dict()
[d [t [0]].append(t [1]) if t [0] in list(d.keys()) 
 else d.update({t [0]: [t [1]]}) for t in l]
d

OUTPUT: {'A': [1, 5], 'B': [2], 'C': [3], 'D': [0, 9]}
Tam Le
la source
Impressionnant! M'a aidé.
unpairestgood
super !, beaucoup aidé
Athar
2

Une autre façon d'utiliser la compréhension du dictionnaire,

>>> t = [('A', 1), ('B', 2), ('C', 3)]
>>> d = { i:j for i,j in t }
>>> d
{'A': 1, 'B': 2, 'C': 3}
Arun
la source
2

Si Tuple n'a pas de répétitions de touches, c'est Simple.

tup = [("A",0),("B",3),("C",5)]
dic = dict(tup)
print(dic)

Si le tuple a des répétitions clés.

tup = [("A",0),("B",3),("C",5),("A",9),("B",4)]
dic = {}
for i, j in tup:
    dic.setdefault(i,[]).append(j)
print(dic)
Syed Muhammad Zafar Rizvi
la source
1
l=[['A', 1], ['B', 2], ['C', 3]]
d={}
for i,j in l:
d.setdefault(i,j)
print(d)
Un homme
la source