Tengo una lista de dictados como este:
[{'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?
python
list
dictionary
SuperString
fuente
fuente
Aquí hay otra forma de hacerlo usando las funciones map () y lambda:
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 ese 'valor' pueda faltar como uso clave:
Actualización: tampoco soy un gran fanático de las lambdas, prefiero nombrar cosas ... así es como lo haría con eso en mente:
Incluso iría más allá y crearía una única función que diga explícitamente lo que quiero lograr:
Con Python 3, dado que
map
devuelve un iterador, uselist
para devolver una lista, por ejemplolist(map(operator.itemgetter('value'), l))
.fuente
map
, useoperator.itemgetter('value')
, no alambda
.fuente
getkey
... ¿quieres decird.get('value')
? Eso sería lo mismo que la comprensión de la segunda lista de @ isbadawi, no la de Michal.Para un caso muy simple como este, una comprensión, como en la respuesta de Ismail Badawi, es definitivamente el camino a seguir.
Pero cuando las cosas se vuelven más complicadas y necesita comenzar a escribir comprensiones de múltiples cláusulas o anidadas con expresiones complejas, vale la pena buscar otras alternativas. Hay algunas formas diferentes (casi) estándar para especificar búsquedas de estilo XPath en estructuras anidadas de dict-and-list, como JSONPath, DPath y KVC. Y hay buenas bibliotecas en PyPI para ellos.
Aquí hay un ejemplo con la biblioteca llamada
dpath
, que muestra cómo puede simplificar algo un poco más complicado:O, usando
jsonpath-ng
:A primera vista, este puede no parecer tan simple, porque
find
devuelve objetos de coincidencia, que incluyen todo tipo de cosas además del valor coincidente, como una ruta directamente a cada elemento. Pero para expresiones más complejas, poder especificar una ruta como en'*.[*].value'
lugar de una cláusula de comprensión para cada una*
puede hacer una gran diferencia. Además, JSONPath es una especificación independiente del idioma, e incluso hay probadores en línea que pueden ser muy útiles para la depuración.fuente
Creo que tan simple como a continuación le daría lo que está buscando.
Puede hacer esto con una combinación de
map
ylambda
también, pero la comprensión de la lista se ve más elegante y pitónica.Para una lista de entrada más pequeña, la comprensión es un camino a seguir, pero si la entrada es realmente grande, supongo que los generadores son la forma ideal.
Aquí hay una comparación de todas las soluciones posibles para una mayor entrada
Como puede ver, los generadores son una mejor solución en comparación con los demás, el mapa también es más lento en comparación con el generador, por lo que dejaré que OP lo descubra.
fuente
Sigue el ejemplo --
fuente
¿Obtener valores clave de la lista de diccionarios en Python?
Ex:
para d en datos:
Salida:
fuente
Una forma muy simple de hacerlo es:
Salida:
fuente