2009-11-05 8 views
111

Eventuali duplicati:
How can I convert a Python dictionary to a list of tuples?Conversione Python dizionario la lista

Sto cercando di convertire un dizionario Python in una lista Python, al fine di eseguire alcuni calcoli.

#My dictionary 
dict = {} 
dict['Capital']="London" 
dict['Food']="Fish&Chips" 
dict['2012']="Olympics" 

#lists 
temp = [] 
dictList = [] 

#My attempt: 
for key, value in dict.iteritems(): 
    aKey = key 
    aValue = value 
    temp.append(aKey) 
    temp.append(aValue) 
    dictList.append(temp) 
    aKey = "" 
    aValue = "" 

Questo è il mio tentativo ... ma non riesco a capire cosa c'è che non va?

+0

'somma (dict.items(),())' – Natim

risposta

92

Il tuo problema è che avete key e value tra virgolette che li rende stringhe, vale a dire si sta impostando aKey per contenere la stringa "key" e non il valore della variabile key. Inoltre, non stai cancellando l'elenco temp, quindi lo stai aggiungendo ogni volta, invece di avere solo due elementi.

per risolvere il tuo codice, provare qualcosa di simile:

for key, value in dict.iteritems(): 
    temp = [key,value] 
    dictlist.append(temp) 

Non è necessario copiare le variabili di loop key e value in un'altra variabile prima di utilizzarli così li ho abbandonato. Allo stesso modo, non è necessario utilizzare append per creare un elenco, è sufficiente specificarlo tra parentesi quadre come mostrato sopra. E avremmo potuto fare dictlist.append([key,value]) se volevamo essere il più brevi possibile.

O semplicemente utilizzare dict.items() come è stato suggerito.

+1

Risposta corretta dovuta a spiegare cosa stavo facendo male . Come puoi vedere, sono abbastanza conosciuto da Python e qualsiasi spiegazione è molto apprezzata. Saluti! – Federer

+1

Se si utilizzano gli elenchi di append come questo, si sta producendo un elenco di elenchi. Quello che voleva era una lista piatta, per la quale useresti extend() come nella risposta di Shay. –

+1

Non l'ha mai detto, Ajith. Un elenco di elenchi è un elenco python valido e un'interpretazione molto migliore di un "dizionario" rispetto a un elenco semplice contenente solo valori non di elenco. Un elenco di elenchi è almeno in grado di mostrare le chiavi e i valori ancora raggruppati. – codetaku

305
dict.items() 

Il trucco.

+7

Sapevo che ci sarebbe un modo ridicolo Pythonic di fare questo, vi ringrazio molto in effetti. Ho appena trovato la documentazione per Python piuttosto difficile da leggere! – Federer

+12

@shylent penso che lo intendesse come in ridicolmente ovvio/facile/pietoso – ofko

+1

Puoi sempre usare * help (dict) * sulla riga di comando di Python e sostituire * dict * con l'oggetto fastidioso per vedere un elenco dei suoi metodi di supporto ecc. ., per esempio * articoli (...) D.items() -> elenco delle coppie D (chiave, valore), come 2 tuple * –

19
>>> a = {'foo': 'bar', 'baz': 'quux', 'hello': 'world'} 
>>> list(reduce(lambda x, y: x + y, a.items())) 
['foo', 'bar', 'baz', 'quux', 'hello', 'world'] 

Per spiegare: a.items() restituisce un elenco di tuple. L'aggiunta di due tuple fa una tupla contenente tutti gli elementi. Quindi la riduzione crea una tupla contenente tutte le chiavi e i valori e quindi la lista (...) crea una lista da quella.

+0

Interessante ... Potrebbe esserci un uso per questo tipo di unione da qualche parte. –

+1

Per python 3.^invece di usare reduce, usa functools.reduce –

10

Probabilmente si vuole proprio questo:

dictList = dict.items() 

Il tuo approccio ha due problemi. Per uno si utilizza key e value tra virgolette, che sono stringhe con le lettere "chiave" e "valore", non correlate alle variabili di tali nomi. Inoltre continui ad aggiungere elementi all'elenco "temporaneo" e non eliminare mai vecchi elementi già presenti in iterazioni precedenti. Assicurarsi di avere una nuova e vuota lista temp in ogni iterazione e utilizzare i key e value variabili:

for key, value in dict.iteritems(): 
    temp = [] 
    aKey = key 
    aValue = value 
    temp.append(aKey) 
    temp.append(aValue) 
    dictList.append(temp) 

Si noti inoltre che questo potrebbe essere scritto più breve senza le variabili temporanee:

for key, value in dict.iteritems(): 
    dictList.append([key, value]) 
36

Si dovrebbe utilizzare dict.items().

ecco una soluzione uno di linea per il vostro problema:

[(k,v) for k,v in dict.items()] 

e risultato:

[('Food', 'Fish&Chips'), ('2012', 'Olympics'), ('Capital', 'London')] 

o si può fare

l=[] 
[l.extend([k,v]) for k,v in dict.items()] 

per:

['Food', 'Fish&Chips', '2012', 'Olympics', 'Capital', 'London'] 
+2

In python 2.6, almeno, non hai bisogno di dict.items(): '[(k, v) per k, v in dict]'. – hughdbrown

+1

Python3.6 - '[x per x in dict.items()]' fa la stessa cosa. – Blacksilver

2

Se stai creando un dizionario solo per creare un elenco di tuple, la creazione di dts come te può essere un problema, potresti utilizzare zip()

È particolarmente utile se ne hai uno intestazione e più righe. Per esempio, se presumo che si desidera Olimpiadi statistiche per i paesi:

headers = ['Capital', 'Food', 'Year'] 
countries = [ 
    ['London', 'Fish & Chips', '2012'], 
    ['Beijing', 'Noodles', '2008'], 
] 

for olympics in countries: 
    print zip(headers, olympics) 

[('Capital', 'London'), ('Food', 'Fish & Chips'), ('Year', '2012')] 
[('Capital', 'Beijing'), ('Food', 'Noodles'), ('Year', '2008')] 

Non so se questo è l'obiettivo finale, e il mio essere fuori tema, ma potrebbe essere qualcosa di tieni a mente.

127

Conversione da dict alla lista è reso facile in Python. Tre esempi:

>> d = {'a': 'Arthur', 'b': 'Belling'} 

>> d.items() 
[('a', 'Arthur'), ('b', 'Belling')] 

>> d.keys() 
['a', 'b'] 

>> d.values() 
['Arthur', 'Belling'] 
+0

E 'possibile specificare l'ordine di 'values ​​()'?È definito l'ordine dei valori di un titolo standard? –

+2

@MichaelScheper [L'ordine di dettatura standard non è specificato] (http://stackoverflow.com/a/9001529/638546) e l'ordine dei valori può essere diverso dall'ordine di inserimento. Tuttavia, si potrebbe [ordinare gli elenchi sopra] (https://wiki.python.org/moin/HowTo/Sorting) o usare ** OrderedDict ** (vedere il primo link). –