2012-05-15 15 views
11

Diciamo che ho il seguente elenco di dizionario Python:Aggiornamento di un elenco di dizionari Python con una chiave, coppia di valori da un altro elenco

dict1 = [{'domain':'Ratios'},{'domain':'Geometry'}] 

e un elenco come:

list1 = [3, 6] 

I' d come aggiornare dict1 o creare un altro elenco come segue:

dict1 = [{'domain':'Ratios', 'count':3}, {'domain':'Geometry', 'count':6}] 

come potrei fare questo?

+0

Secondo l'esempio, il titolo di questa domanda dovrebbe essere: "Aggiornamento di un elenco di valori di dizionari Python da un altro elenco". Dal titolo corrente mi aspetto che list1 = [('Rapporti', 3), ('Geometria', 6)] – yucer

risposta

21
>>> l1 = [{'domain':'Ratios'},{'domain':'Geometry'}] 
>>> l2 = [3, 6] 
>>> for d,num in zip(l1,l2): 
     d['count'] = num 


>>> l1 
[{'count': 3, 'domain': 'Ratios'}, {'count': 6, 'domain': 'Geometry'}] 

Un altro modo di farlo, questa volta con una lista di comprensione che non fa mutano l'originale:

>>> [dict(d, count=n) for d, n in zip(l1, l2)] 
[{'count': 3, 'domain': 'Ratios'}, {'count': 6, 'domain': 'Geometry'}] 
+0

Grazie. La seconda soluzione produce un errore nella sua forma attuale –

+0

Stai usando python 3? Probabilmente lo cambierò per renderlo compatibile. – jamylak

+0

Ora funziona anche in Python 3 se questo era il tuo problema :) – jamylak

5

Si potrebbe fare questo:

for i, d in enumerate(dict1): 
    d['count'] = list1[i] 
2

Si può fare questo:

# list index 
l_index=0 

# iterate over all dictionary objects in dict1 list 
for d in dict1: 

    # add a field "count" to each dictionary object with 
    # the appropriate value from the list 
    d["count"]=list1[l_index] 

    # increase list index by one 
    l_index+=1 

Questa soluzione non crea un nuovo elenco. Invece, aggiorna l'elenco esistente dict1.

+0

Molto prolisso per Python ma spiega tutto molto bene. – jamylak

+1

Sì hai ragione! È molto prolisso. Ma poiché ci sono altre risposte meno verbose qui, penso che sarebbe ok aggiungere una soluzione più esplicativa .. –

+0

Grazie per la spiegazione dettagliata. –

0

Usare la comprensione delle liste sarà il modo più pazzo per farlo.

[data.update({'count': list1[index]}) for index, data in enumerate(dict1)] 

Il dict1 verrà aggiornato con il valore corrispondente dalla list1.

+1

-1 L'uso di una comprensione di lista per le mutazioni è ** non ** pythonic. Utilizzare un ciclo for semplice. L'aggiornamento – jamylak

+0

su un lavoro di dettatura sul riferimento non fornisce output. data.update() restituisce Nessuno. Uscirai come [Nessuno, Nessuno, ....] –

Problemi correlati