Quelle est la meilleure façon de rechercher une liste de dicts en Python?
-
29-09-2019 - |
Question
Ma base de données retourne actuellement une liste de dicts:
id_list = ({'id': '0c871320cf5111df87da000c29196d3d'},
{'id': '2eeeb9f4cf5111df87da000c29196d3d'},
{'id': '3b982384cf5111df87da000c29196d3d'},
{'id': '3f6f3fcecf5111df87da000c29196d3d'},
{'id': '44762370cf5111df87da000c29196d3d'},
{'id': '4ba0d294cf5111df87da000c29196d3d'})
Comment puis-je vérifier facilement si un identifiant donné est dans cette liste ou non?
Merci.
La solution
si vous faites un dictionnaire de votre identifiant de recherche,
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'
Autres conseils
Voici une seule ligne:
if some_id in [d.get('id') for d in id_list]:
pass
Pas si très efficace.
modifier - Une meilleure approche pourrait être:
if some_id in (d.get('id') for d in id_list):
pass
De cette façon, la liste est pas générée en pleine longueur d'avance.
Comment puis-je vérifier facilement si un identifiant donné est dans cette liste ou non?
Faire un ensemble
keys = set( d['id'] for d in id_list )
if some_value in keys
Ne demandez pas si cela est « efficace » ou « meilleur ». Il implique le compromis standard.
Construire l'ensemble prend du temps. Mais la recherche est alors instantanée.
-
Si vous faites beaucoup de recherches, le coût de la construction de l'ensemble est amorti sur chaque recherche.
-
Si vous faites quelques recherches, le coût de la construction de l'ensemble peut être supérieur à quelque chose iLike
{'id':some_value} in id_list
.
any(x.get('id')==given_id for x in id_list)
. . . retourne un booléen. Efficacité? Voir la réponse de S. Lott
Vous pouvez l'aplatir avec une compréhension de la liste et l'utilisation dans:
id in [d['id'] for d in id_list]
Vous pouvez également utiliser des expressions de générateur, qui ont des caractéristiques de performance (et utilisera moins de mémoire si votre liste est énorme):
id in (d['id'] for d in id_list)