2009-10-16 8 views
14

je la structure de données suivantes:Quelle est la meilleure façon de rechercher une valeur de dictionnaire Python dans une liste de dictionnaires?

data = [ 
     {'site': 'Stackoverflow', 'id': 1}, 
     {'site': 'Superuser', 'id': 2}, 
     {'site': 'Serverfault', 'id': 3} 
    ] 

Je veux rechercher dans la liste ci-dessus pour voir si elle a un site avec une valeur spécifique. Par exemple, recherchez ci-dessus pour voir si la liste contient un dictionnaire avec le site = 'Superuser' et renvoyez Vrai/Faux. Je peux faire ce qui précède la manière habituelle de boucler chaque élément et de les comparer. Existe-t-il un moyen alternatif d'effectuer une recherche?

+3

Il existe des optimisations si les données sont triées. Sinon, utilisez simplement la solution 'any()'. – Triptych

Répondre

25
any(d['site'] == 'Superuser' for d in data) 
+9

Wow, nous avons posté le * exact * même contenu dans les 10 secondes les uns des autres. Je suppose que je vais supprimer le mien. :( – FogleBird

+1

note que cela exactement "boucle sur chaque élément et les comparer", ce qui est ce que Thierry Lam ne voulait pas – nosklo

+0

Je pense qu'il voulait dire une boucle normale 'for'. –

4

Les listes nécessitent absolument des boucles. C'est ce que les listes sont pour.

Pour éviter les boucles, vous devez éviter les listes.

Vous souhaitez des dictionnaires de clés de recherche et d'objets.

sites = dict((d['site'],d) for d in data) 
ids = dict((d['id'],d] for d in data) 

Maintenant, vous pouvez trouver l'élément associé à « super-utilisateur » avec sites["Superuser"] en utilisant une recherche au lieu de hachage une boucle.

9
filter(lambda x: x['site']=='Superuser', data) 
1

Je ne suis pas sûr de la syntaxe python, mais il peut travailler pour vous de cette façon. Lors de la construction de votre structure de données primaire, créez également une structure parallèle qui est un hachage ou un tableau associatif associé au nom du site; Ensuite, pour voir si un site existe, vous essayez de rechercher dans le hash avec le nom du site. S'il réussit, vous savez qu'il existe un enregistrement dans votre structure de données pour ce site et que vous l'avez fait au moment de la recherche de hachage (probablement O (1) ou O (log2 (n)) selon la technique de hachage) de l'O (n/2) de la traversée de la liste.

(mis à jour lors de l'écriture: c'est à peu près ce que S.Lott a publié)

Questions connexes