¿Cuál es la forma más fácil de buscar a través de una lista de dicts en Python?
-
29-09-2019 - |
Pregunta
Mi base de datos actualmente devuelve una lista de dicts:
id_list = ({'id': '0c871320cf5111df87da000c29196d3d'},
{'id': '2eeeb9f4cf5111df87da000c29196d3d'},
{'id': '3b982384cf5111df87da000c29196d3d'},
{'id': '3f6f3fcecf5111df87da000c29196d3d'},
{'id': '44762370cf5111df87da000c29196d3d'},
{'id': '4ba0d294cf5111df87da000c29196d3d'})
¿Cómo puedo comprobar fácilmente si un identificador dado es en esta lista o no?
Gracias.
Solución
si hace un diccionario de su búsqueda de identidad,
search_dic = {'id': '0c871320cf5111df87da000c29196d3d'}
id_list = ({'id': '0c871320cf5111df87da000c29196d3d'},
{'id': '2eeeb9f4cf5111df87da000c29196d3d'},
{'id': '3b982384cf5111df87da000c29196d3d'},
{'id': '3f6f3fcecf5111df87da000c29196d3d'},
{'id': '44762370cf5111df87da000c29196d3d'},
{'id': '4ba0d294cf5111df87da000c29196d3d'})
if search_dic in id_list:
print 'yes'
Otros consejos
Aquí hay una sola línea:
if some_id in [d.get('id') for d in id_list]:
pass
No es muy eficiente, aunque.
editar - Un mejor enfoque podría ser:
if some_id in (d.get('id') for d in id_list):
pass
De esta manera, la lista no se genera en longitud completa de antemano.
¿Cómo puedo comprobar fácilmente si un identificador dado es en esta lista o no?
Hacer un conjunto
keys = set( d['id'] for d in id_list )
if some_value in keys
No pregunte si esto es "eficaz" o "mejor". Se trata de la compensación estándar.
La construcción del conjunto lleva tiempo. Pero la búsqueda es entonces instante.
-
Si usted hace un montón de búsquedas, el costo de construir el conjunto se amortiza en cada búsqueda.
-
Si lo hace pocas operaciones de búsqueda, el costo de construir el conjunto puede ser algo mayor que iLike
{'id':some_value} in id_list
.
any(x.get('id')==given_id for x in id_list)
. . . retornos booleanas. ¿Eficiencia? Véase la respuesta de S. Lott
Se puede acoplar con una lista por comprensión y uso en:
id in [d['id'] for d in id_list]
También puede utilizar las expresiones generadoras, que tienen diferentes características de rendimiento (y utilizará menos memoria si la lista es enorme):
id in (d['id'] for d in id_list)