Come convertire un elenco di tuple valore-chiave in dizionario?


125

Ho un elenco che assomiglia a:

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

Voglio trasformarlo in un dizionario che assomiglia a:

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

Qual è il modo migliore per farlo?

EDIT: il mio elenco di tuple è in realtà più simile a:

[(A, 12937012397), (BERA, 2034927830), (CE, 2349057340)]

1
Che tipo di entità sono A, B(o BERA) e C(o CE) in realtà? Grazie
mangia il

Sono disposto a scommettere che gli errori prodotti con gli esempi di lavoro di seguito sono correlati al fatto che lui non ha un elenco di tuple, ma un elenco estremamente lungo che desidera diviso in 2 tuple.
gddc,

Risposte:


90

Questo mi dà lo stesso errore del tentativo di dividere l'elenco e comprimerlo. ValueError: l'elemento sequenza numero aggiornamento dizionario 0 ha lunghezza 1916; 2 è richiesto

Questa è la tua vera domanda.

La risposta è che gli elementi del tuo elenco non sono quelli che pensi siano. Se digiti myList[0], scoprirai che il primo elemento del tuo elenco non è una doppia tupla, ad esempio ('A', 1), ma piuttosto un iterabile di 1916 lunghezze.

Una volta tu effettivamente un elenco nel modulo che hai dichiarato nella tua domanda originale ( myList = [('A',1),('B',2),...]), tutto ciò che devi fare è dict(myList).


Grazie, non so come sia arrivato l'elenco in questo modo ma dopo averlo rielaborato da zero, sono stato in grado di risolverlo.
Fred Wilson,

1
@DJ_Stuffy_K: (supponendo che il contesto non sia correlato a questa domanda) In generale, a meno che non sia superfluo o rallenta il programma, è perfettamente utile creare dicts come utili indici in qualsiasi struttura di dati astratta che stai implicitamente costruendo. La nozione di "buona pratica" dipende interamente dal contesto; hai bisogno di tempo di ricerca O (1) per le chiavi? Inoltre non è possibile "convertire elenchi in dizionari" arbitrariamente; dipende interamente dalla semantica. es. [(1,2), (1,3)]-> {1:3}bloccherebbe le tue chiavi e perderebbe informazioni! Un dict è una relazione uno a * con il tempo di inserimento / eliminazione O (1). Elenco è un elenco.
ninjagecko,

162
>>> dict([('A', 1), ('B', 2), ('C', 3)])
{'A': 1, 'C': 3, 'B': 2}

5
Ha anche commentato un'altra risposta che suggerisce lo stesso: questo non copre la presenza di duplicati "chiavi" di tupla, ad esempio: si l=[('A',1), ('B',2), ('C',3), ('A', 2)]otterrà il risultato 'A': 1che potrebbe non essere il risultato desiderato.
Guiva

32

Hai provato questo?

>>> l=[('A',1), ('B',2), ('C',3)]
>>> d=dict(l)
>>> d
{'A': 1, 'C': 3, 'B': 2}

ValueError: l'elemento sequenza numero aggiornamento dizionario 0 ha lunghezza 1916; 2 è richiesto
Fred Wilson,

Era un taglio diretto dal mio terminale, quindi dovrebbe funzionare. Puoi mostrare esattamente cosa hai fatto per ottenere quell'errore?
Inutile

@Fred, devi aver sbagliato a scrivere qualcosa, questa risposta va bene.
martineau,

@FredWilson è l'errore che di solito si verifica quando si prova qualcosa del generedict([string1, string2, string3, string4])
chacham15

2
Questo non copre avere 'chiavi' duplicate di tuple, ad esempio: si l=[('A',1), ('B',2), ('C',3), ('A', 2)]otterrà il 'A': 1quale potrebbe non essere il risultato desiderato.
Guiva

10

Ecco un modo per gestire le "chiavi" duplicate della tupla:

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

Eccezionale! Mi ha aiutato
unpairestgood

ottimo !, aiutato molto
Athar

2

Un altro modo di usare la comprensione del dizionario,

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

2

Se Tuple non ha ripetizioni chiave, è semplice.

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

Se la tupla ha ripetizioni chiave.

tup = [("A",0),("B",3),("C",5),("A",9),("B",4)]
dic = {}
for i, j in tup:
    dic.setdefault(i,[]).append(j)
print(dic)

1
l=[['A', 1], ['B', 2], ['C', 3]]
d={}
for i,j in l:
d.setdefault(i,j)
print(d)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.