2011-09-01 10 views
61

Ho una lista di dict in questo modo:pitone ottenere un elenco di valori dalla lista di dict

[{'value': 'apple', 'blah': 2}, {'value': 'banana', 'blah': 3} , {'value': 'cars', 'blah':4}] 

voglio ['apple', 'banana', 'cars']

cosa è il modo migliore per fare questo?

+0

1) Che cosa hai provato? Per favore includi il tuo codice. 2) "migliore" è una parola priva di significato in questo contesto: la migliore potrebbe significare la più veloce, la meno memoria o la maggior parte dell'uso di prodotti con licenza Oracle. Non sappiamo cosa intendi per "migliore". E non possiamo commentare il codice che non hai pubblicato. –

+4

Forse voleva solo chiedere qual è il modo "pythonic" per farlo –

+1

Mr @ S.Lott, ci sono così tante domande su SO che non hanno codice, ma hanno risposte, risposte meravigliose, se non vuoi per pubblicare una risposta perché xoy, ignora semplicemente questo post e basta. : v Molti anni fa. –

risposta

129

Supponendo che ogni dict ha una chiave value, è possibile scrivere (supponendo che la vostra lista si chiama l)

[d['value'] for d in l] 

Se value potrebbe mancare, è possibile utilizzare

[d['value'] for d in l if 'value' in d] 
+0

Per trattare il valore mancante per una chiave, si può anche usare d.get ("key_to_lookup", "alternate_value"). Quindi, apparirà: [d.get ('value', 'alt') per d in l]. Se il valore non è presente come chiave, verrà semplicemente restituito "alt". – abhinav

12
[x['value'] for x in list_of_dicts] 
+0

o [d.getkey ('valore') per d in dict_list] – rplnt

+0

@rplnt, Nope. ':)' –

+0

@rpInt Um, non esiste una cosa come 'getkey' ... intendi' d.get ('value') '? Sarebbe come la seconda lista di @ isbadawi, non quella di Michal. – agf

13

Ecco un altro modo per farlo usando le funzioni map() e lambda:

>>> map(lambda d: d['value'], l) 

dove l è la lista. Vedo in questo modo "più sexy", ma lo farei usando la comprensione delle liste.

Aggiornamento: Nel caso in cui 'valore' potrebbe essere mancante come un uso chiave:

>>> map(lambda d: d.get('value', 'default value'), l) 

Update: Io non sono un grande fan di lambda, preferisco chiamare le cose ... questo è come lo farei con questo in mente:

>>> import operator 
>>> map(operator.itemgetter('value'), l) 

vorrei anche andare oltre e creare una sola funzione che dice esplicitamente ciò che voglio raggiungere:

>>> import operator, functools 
>>> get_values = functools.partial(map, operator.itemgetter('value')) 
>>> get_values(l) 
... [<list of values>] 
+0

Lordo! La comprensione delle liste ha molto più senso qui. –

+1

Se vuoi usare la prima 'mappa', usa' operator.itemgetter ('value') ', non a' lambda'. – agf

+0

+1 per essere pietonici con 'map' e' lambda' – rickcnagy

Problemi correlati