2011-10-26 15 views
9

Suponga que tiene una lista de los diccionarios como éste:elemento extracto de la lista de diccionarios

a = [ {'name':'pippo', 'age':'5'} , {'name':'pluto', 'age':'7'} ] 

¿Qué le permite extraer de esta lista sólo el dict donde nombre == plutón? Para hacer las cosas un poco más difícil, considero que no puedo hacer ninguna importación

+0

¿qué desea extraer? :/ –

+0

el diccionario, es decir {'nombre': 'plutón', 'edad': '7'} –

Respuesta

18

Lista comprensión es ideal para esto:

[d for d in a if d['name'] == 'pluto'] 
+3

Es 'si' no 'dónde'. Editar: Veo que lo arregló. Vale la pena mencionar que esto sigue siendo una lista, ya que existe un potencial de resultados múltiples con ese valor: si está seguro de que solo hay uno y solo quiere uno, solo acceda al elemento en la posición 0 en esa nueva lista. –

+0

¡Genial! ¡resolviste mi problema, gracias! –

+0

@Lattyware Sí, lo edité tan pronto como lo vi. Usted se dio cuenta rápidamente :) Y sí, producirá una lista. Usar [0] directamente es peligroso, aunque si el resultado será una lista vacía. Puede usar algo como 'x = x [0] si x else {}' en el resultado. O si el 'nombre' es único, entonces' [x] = [d para d en a si d ['nombre'] == 'plutón'] o [{}] ' – rplnt

1
[d for d in a if d['name'] == 'pluto'] 
1
>>> [d['age'] for d in a if d['name']=='pluto'] 
['7'] 
+0

Dado que dejase' Para especificar, se presumiría que quieren extraer todo el dict, pero si quieren algo en particular, entonces esta es una buena solución. –

1

Usar una lista por comprensión que recoge el dict correcta en la lista de dicts.

>>> [d for d in a if d['name']=='pluto'] 
[{'age': '7', 'name': 'pluto'}] 

O, si usted no está seguro de si todos los dicts en a tienen una clave 'nombre',

>>> [d for d in a if d.get('name')=='pluto'] 
[{'age': '7', 'name': 'pluto'}] 

Tenga en cuenta que ambos devuelven una lista. Si sabe que sólo hay una entrada coincidente, se puede añadir [0] hasta el final para devolver el dict real:

>>> [d for d in a if d['name']=='pluto'][0] 
{'age': '7', 'name': 'pluto'} 
8

Aparte de lista por comprensión que otras respuestas que dan a usted, usted también puede hacerlo con una filtro y una lambda:

filter(lambda x: x.get('name') == 'pluto',a) 
Cuestiones relacionadas