2010-10-13 3 views
1

Ma base de données retourne actuellement une liste des dicts:Quel est le moyen le plus simple de faire une recherche parmi une liste de dictionnaires en Python?

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.

+1

Quelle base de données est-ce? N'est-il pas possible de faire une requête et laisser la DB gérer ce problème? – AndiDog

+0

J'utilise MySQLdb. S'il y a un moyen de retourner une simple liste d'ID, ce serait génial. Je n'en connais tout simplement pas! – ensnare

Répondre

5

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' 
+0

C'était vraiment utile. Je vous remercie. – ensnare

2

Vous pouvez 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) 
+0

Merci, lequel d'entre eux est plus efficace? – ensnare

+1

@ensnare: Le second, il s'arrêtera dès qu'il trouvera l'identifiant. Cependant, si vous allez le faire souvent, mettez tous les identifiants dans un ensemble: 'ids = set (d ['id'] pour d dans id_list)' et ensuite vérifiez si 'givenId in ids' – eumiro

+0

Cela a été vraiment utile . Je vous remercie. – ensnare

7

Voici un one-liner:

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

Pas très efficace si .

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 n'est pas générée en pleine longueur d'avance.

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

. . . renvoie un booléen. Efficacité? Voir la réponse de S.Lott

7

Comment puis-je vérifier facilement si un ID donné figure 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". Cela implique le compromis standard.

La construction de l'ensemble prend du temps. Mais la recherche est alors instantanée.

  • Si vous faites beaucoup de recherches, le coût de construction de l'ensemble est amorti sur chaque recherche.

  • Si vous faites peu de recherches, le coût de construction de l'ensemble peut être plus élevé que celui de {'id':some_value} in id_list.

Questions connexes