2011-09-01 7 views
61

tengo una lista de dict la siguiente manera:pitón obteniendo una lista de valor de la lista de dict

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

Quiero ['apple', 'banana', 'cars']

Cuál es la mejor manera de hacer esto?

+0

1) ¿Qué has probado? Por favor incluya su código. 2) "lo mejor" es una palabra sin sentido en este contexto: lo mejor podría significar la más rápida, la menos memoria o la mayor parte del uso de productos con licencia de Oracle. No sabemos a qué te refieres con "mejor". Y no podemos comentar sobre el código que no publicaste. –

+4

Tal vez solo quería preguntar cuál es la forma "pitónica" de hacerlo –

+1

Mr @ S.Lott, hay tantas preguntas sobre SO que no tiene código, pero tiene respuestas, respuestas maravillosas, si no lo quiere 't para publicar una respuesta porque x o y, simplemente ignora esta publicación y eso es todo. : v Hace muchos años. –

Respuesta

129

Suponiendo que todos los dict tiene una clave value, puede escribir (asumiendo que su lista se denomina l)

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

Si value podría hacer falta, se puede utilizar

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

Para tratar el valor que falta para una clave, también se puede usar d.get ("key_to_lookup", "alternate_value"). Entonces, se verá así: [d.get ('valor', 'alt') para d en l]. Si el valor no está presente como clave, simplemente devolverá 'alt'. – abhinav

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

o [d.getkey ('valor') para d en dict_list] – rplnt

+0

@rplnt, Nope. ':)' –

+0

@rpInt Um, no existe tal cosa como 'getkey' .. ¿quiere decir' d.get ('value') '? Eso sería lo mismo que la comprensión de la segunda lista de @isabadawi, no de Michal. – agf

13

Aquí es Otra forma de hacerlo usando map() y funciones lambda:

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

donde l es la lista. Veo de esta manera "más sexy", pero lo haría usando la lista de comprensión.

Actualización: En caso de que el 'valor' puede faltar como un uso clave:

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

Actualización: Yo tampoco soy un gran fan de lambdas, prefiero nombrar las cosas ... esto es la forma en que lo haría con esto en mente:

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

incluso iría más allá y crear una única función que dice explícitamente lo que quiero lograr:

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

Bruto! La comprensión de la lista tiene mucho más sentido aquí. –

+1

Si va a utilizar el primer 'mapa', use' operator.itemgetter ('value') ', no' lambda'. – agf

+0

+1 por ser pitónico con 'map' y' lambda' – rickcnagy

Cuestiones relacionadas