Supongamos que tengo esto:
[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5},
{"name": "Pam", "age": 7}
]
y al buscar "Pam" como nombre, quiero recuperar el diccionario relacionado: {name: "Pam", age: 7}
¿Cómo lograr esto?
python
search
dictionary
Hellnar
fuente
fuente
[item for item in dicts if item["name"] == "Pam"][0]
?enumerate()
a generar un índice de ejecución:next(i for i, item in enumerate(dicts) if item["name"] == "Pam")
.Esto me parece la forma más pitónica:
resultado (devuelto como una lista en Python 2):
Nota: En Python 3, se devuelve un objeto de filtro. Entonces la solución python3 sería:
fuente
len()
,list()
primero debe invocar el resultado. O: stackoverflow.com/questions/19182188/…r
is alist
next(filter(lambda x: x['name'] == 'Pam', dicts))
La respuesta de @ Frédéric Hamidi es genial. En Python 3.x, la sintaxis de
.next()
cambió ligeramente. Por lo tanto, una ligera modificación:Como se menciona en los comentarios de @Matt, puede agregar un valor predeterminado como tal:
fuente
Puedes usar una lista de comprensión :
fuente
fuente
def search(list, key, value): for item in list: if item[key] == value: return item
Probé varios métodos para revisar una lista de diccionarios y devolver los diccionarios donde la clave x tiene un cierto valor.
Resultados:
Todas las pruebas realizadas con Python 3.6 .4, W7x64.
Resultados:
fuente
Para agregar solo un poquito a @ FrédéricHamidi.
En caso de que no esté seguro de que una clave esté en la lista de dictados, algo como esto ayudaría:
fuente
item.get("name") == "Pam"
¿Alguna vez has probado el paquete de pandas? Es perfecto para este tipo de tarea de búsqueda y también optimizado.
He agregado un poco de evaluación comparativa a continuación para ilustrar los tiempos de ejecución más rápidos de los pandas a mayor escala, es decir, más de 100k entradas:
fuente
Esta es una forma general de buscar un valor en una lista de diccionarios:
fuente
Esta es una forma ...
fuente
Simplemente usando la comprensión de la lista:
Código de muestra:
fuente
Puede lograr esto con el uso del filtro y los siguientes métodos en Python.
filter
El método filtra la secuencia dada y devuelve un iterador.next
El método acepta un iterador y devuelve el siguiente elemento de la lista.Para que pueda encontrar el elemento,
y la salida es,
Nota: El código anterior volverá en
None
caso de que no se encuentre el nombre que estamos buscando.fuente
Mi primer pensamiento sería que tal vez quieras considerar crear un diccionario de estos diccionarios ... si, por ejemplo, lo estuvieras buscando más de un pequeño número de veces.
Sin embargo, eso podría ser una optimización prematura. Qué estaría mal con:
fuente
fuente
Una forma simple de usar las comprensiones de listas es, si
l
es la listaentonces
fuente
Puedes probar esto:
fuente
Aquí hay una comparación usando iteración a través de la lista, usando filtro + lambda o refactorizando (si es necesario o válido para su caso) su código para dictar dictados en lugar de la lista de dictados
Y la salida es esta:
Conclusión: Claramente, tener un diccionario de dictados es la forma más eficiente de poder buscar en esos casos, donde sabe que buscará solo por identificación. Curiosamente, usar filtro es la solución más lenta.
fuente
Tienes que revisar todos los elementos de la lista. ¡No hay un atajo!
A menos que en otro lugar mantenga un diccionario de los nombres que apuntan a los elementos de la lista, pero luego debe ocuparse de las consecuencias de que aparezca un elemento de su lista.
fuente
Encontré este hilo cuando estaba buscando una respuesta a la misma pregunta. Si bien me doy cuenta de que es una respuesta tardía, pensé en contribuir en caso de que sea útil para alguien más:
fuente
La mayoría (si no todas) las implementaciones propuestas aquí tienen dos defectos:
Una propuesta actualizada:
Quizás no sea el más pitónico, pero al menos un poco más seguro.
Uso:
La esencia .
fuente