web-dev-qa-db-fra.com

Comment extraire toutes les valeurs d'une clé spécifique d'une liste de dictionnaires?

J'ai une liste de dictionnaires qui ont tous la même structure dans la liste. Par exemple:

test_data = [{'id':1, 'value':'one'}, {'id':2, 'value':'two'}, {'id':3, 'value':'three'}]

Je souhaite obtenir chacun des éléments value de chaque dictionnaire de la liste:

['one', 'two', 'three']

Je peux bien sûr parcourir la liste et extraire chaque valeur à l'aide d'une boucle for:

results = []
for item in test_data:
    results.append(item['value'])

cependant, mon ensemble de données est assez volumineux. Je me demande s'il existe un moyen plus rapide de procéder.

21
James Mertz

Si vous avez juste besoin de parcourir les valeurs une fois, utilisez l'expression du générateur:

generator = ( item['value'] for item in test_data )

...

for i in generator:
    do_something(i)

Une autre option (ésotérique) pourrait être d'utiliser map avec itemgetter - elle pourrait être légèrement plus rapide que l'expression du générateur, ou non, selon les circonstances:

from operator import itemgetter

generator = map(itemgetter('value'), test_data)

Et si vous avez absolument besoin d'une liste, une compréhension de la liste est plus rapide que list.append itérée, ainsi:

results = [ item['value'] for item in test_data ]
21
Antti Haapala

Tu peux le faire:

result = map (lambda x:x['value'],test_data)
8
levi

Si vos données sont vraiment volumineuses, un générateur sera plus efficace:

list((object['value'] for object in test_data))

ex:

>>> list((object['value'] for object in test_data))
['one', 'two', 'three']

La partie génératrice est la suivante:

(object['value'] for object in test_data)

En encapsulant cela dans une list(), vous épuisez le générateur et renvoyez bien ses valeurs dans un tableau.

0
agconti