Domanda

Il mio database attualmente restituisce un elenco di dicts:

id_list = ({'id': '0c871320cf5111df87da000c29196d3d'}, 
           {'id': '2eeeb9f4cf5111df87da000c29196d3d'}, 
           {'id': '3b982384cf5111df87da000c29196d3d'}, 
           {'id': '3f6f3fcecf5111df87da000c29196d3d'}, 
           {'id': '44762370cf5111df87da000c29196d3d'}, 
           {'id': '4ba0d294cf5111df87da000c29196d3d'})

Come posso controllare facilmente se un dato id è in questo elenco o no?

Grazie.

È stato utile?

Soluzione

se si commette un dizionario della ricerca id,

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'

Altri suggerimenti

Ecco una battuta:

if some_id in [d.get('id') for d in id_list]:
    pass

Non è molto efficiente, anche se.

modifica - Un approccio migliore potrebbe essere:

if some_id in (d.get('id') for d in id_list):
    pass

In questo modo, l'elenco non viene generato in tutta la lunghezza in anticipo.

  

Come posso controllare facilmente se un dato id è in questo elenco o no?

Crea un set

keys = set( d['id'] for d in id_list )
if some_value in keys

Non chiedere se questo è "efficiente" o "migliore". Coinvolge il compromesso standard.

La costruzione del set richiede tempo. Ma la ricerca è quindi immediato.

  • Se si fanno un sacco di ricerche, il costo di costruzione del set è ammortizzato in ogni ricerca.

  • Se fai qualche ricerche, il costo di costruzione del set può essere superiore a qualcosa di iLike {'id':some_value} in id_list.

any(x.get('id')==given_id for x in id_list)

. . . ritorna booleani. Efficienza? Vedi la risposta di S. Lott

Si può appiattire con una comprensione lista e l'uso in:

id in [d['id'] for d in id_list]

È anche possibile utilizzare espressioni generatore, che hanno diverse caratteristiche di prestazione (e userà meno memoria se l'elenco è enorme):

id in (d['id'] for d in id_list)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top