Supposons que j'ai ceci:
[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5},
{"name": "Pam", "age": 7}
]
et en recherchant "Pam" comme nom, je veux récupérer le dictionnaire associé: {name: "Pam", age: 7}
Comment y parvenir?
python
search
dictionary
Hellnar
la source
la source
[item for item in dicts if item["name"] == "Pam"][0]
?enumerate()
à générer un index en cours d' exécution:next(i for i, item in enumerate(dicts) if item["name"] == "Pam")
.Cela me semble de la manière la plus pythonique:
résultat (renvoyé sous forme de liste en Python 2):
Remarque: En Python 3, un objet filtre est renvoyé. La solution python3 serait donc:
la source
len()
, vous devez d'abord appelerlist()
le résultat. Ou: stackoverflow.com/questions/19182188/…r
is alist
next(filter(lambda x: x['name'] == 'Pam', dicts))
@ La réponse de Frédéric Hamidi est excellente. Dans Python 3.x, la syntaxe de
.next()
légèrement modifiée. Ainsi une légère modification:Comme mentionné dans les commentaires de @Matt, vous pouvez ajouter une valeur par défaut en tant que telle:
la source
Vous pouvez utiliser une liste de compréhension :
la source
la source
def search(list, key, value): for item in list: if item[key] == value: return item
J'ai testé différentes méthodes pour parcourir une liste de dictionnaires et retourner les dictionnaires où la clé x a une certaine valeur.
Résultats:
Tous les tests effectués avec Python 3.6 .4, W7x64.
Résultats:
la source
Pour ajouter un tout petit peu à @ FrédéricHamidi.
Dans le cas où vous n'êtes pas sûr qu'une clé se trouve dans la liste des dictés, quelque chose comme ça aiderait:
la source
item.get("name") == "Pam"
Avez-vous déjà essayé le package pandas? Il est parfait pour ce type de tâche de recherche et optimisé également.
J'ai ajouté un peu de benchmarking ci-dessous pour illustrer les temps d'exécution plus rapides des pandas à plus grande échelle, c'est-à-dire 100 000 entrées et plus:
la source
C'est une manière générale de rechercher une valeur dans une liste de dictionnaires:
la source
C'est une façon ...
la source
En utilisant simplement la compréhension de la liste:
Exemple de code:
la source
Vous pouvez y parvenir avec l'utilisation du filtre et des méthodes suivantes en Python.
filter
La méthode filtre la séquence donnée et renvoie un itérateur.next
accepte un itérateur et retourne l'élément suivant dans la liste.Vous pouvez donc trouver l'élément par,
et la sortie est,
Remarque: Le code ci-dessus retournera au
None
cas où le nom que nous recherchons n'est pas trouvé.la source
Ma première pensée serait que vous souhaitiez peut-être envisager de créer un dictionnaire de ces dictionnaires ... si, par exemple, vous alliez le rechercher plus d'un petit nombre de fois.
Cependant, cela pourrait être une optimisation prématurée. Quel serait le problème avec:
la source
la source
Une façon simple d'utiliser les compréhensions de liste est, si
l
la liste estpuis
la source
Vous pouvez essayer ceci:
la source
Voici une comparaison en utilisant la liste itérative throuhg, en utilisant un filtre + lambda ou en refactorisant (si nécessaire ou valide pour votre cas) votre code pour dicter des dict plutôt qu'une liste de dict
Et la sortie est la suivante:
Conclusion: Avoir clairement un dictionnaire de dict est le moyen le plus efficace de pouvoir rechercher dans ces cas, où vous savez dire que vous rechercherez uniquement par identifiant. intéressant d'utiliser un filtre est la solution la plus lente.
la source
Vous devez parcourir tous les éléments de la liste. Il n'y a pas de raccourci!
Sauf si ailleurs, vous conservez un dictionnaire des noms pointant vers les éléments de la liste, mais vous devez alors vous occuper des conséquences de l'extraction d'un élément de votre liste.
la source
J'ai trouvé ce fil lorsque je cherchais une réponse à la même question. Bien que je réalise que c'est une réponse tardive, j'ai pensé que j'y contribuerais au cas où cela serait utile à quelqu'un d'autre:
la source
La plupart (sinon la totalité) des implémentations proposées ici ont deux défauts:
Une proposition mise à jour:
Peut-être pas le plus pythonique, mais au moins un peu plus sûr.
Usage:
L' essentiel .
la source