Ho una lista di dizionari che hanno tutti la stessa struttura all’interno della lista. Per esempio:
test_data = [{'id':1, 'value':'one'}, {'id':2, 'value':'two'}, {'id':3, 'value':'three'}]
Voglio ottenere ciascuno degli elementi di value
da ciascun dizionario nell’elenco:
['one', 'two', 'three']
Ovviamente posso scorrere l’elenco ed estrarre ogni valore usando un ciclo for:
results = [] for item in test_data: results.append(item['value'])
tuttavia il mio set di dati è abbastanza grande. Mi chiedo se c’è un modo più veloce per questo.
Se hai solo bisogno di scorrere i valori una volta, usa l’espressione del generatore:
generator = ( item['value'] for item in test_data ) ... for i in generator: do_something(i)
Un’altra opzione (esoterica) potrebbe essere quella di usare la map
con itemgetter
– potrebbe essere leggermente più veloce dell’espressione del generatore o meno, a seconda delle circostanze:
from operator import itemgetter generator = map(itemgetter('value'), test_data)
E se hai assolutamente bisogno di una lista, la comprensione di una lista è più veloce della list.append
iterata. list.append
, quindi:
results = [ item['value'] for item in test_data ]
Puoi farlo:
result = map (lambda x:x['value'],test_data)
Se i tuoi dati sono veramente grandi, un generatore sarà più efficiente:
list((object['value'] for object in test_data))
ex:
>>> list((object['value'] for object in test_data)) ['one', 'two', 'three']
La parte del generatore è questa:
(object['value'] for object in test_data)
Racchiudendolo in un list()
, si estingue il generatore e si restituiscono i suoi valori in modo corretto in un array.