Qual è il modo più semplice per la ricerca in un elenco di dicts in Python?
-
29-09-2019 - |
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.
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)