¿Cuál es la forma más fácil de buscar a través de una lista de dicts en Python?

StackOverflow https://stackoverflow.com/questions/3924397

  •  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.

¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top