J'ai une liste de dictés:
list = [{'id':'1234','name':'Jason'},
{'id':'2345','name':'Tom'},
{'id':'3456','name':'Art'}]
Comment puis-je trouver efficacement la position d'index [0], [1] ou [2] en faisant correspondre le nom = 'Tom'?
S'il s'agissait d'une liste unidimensionnelle, je pourrais faire list.index () mais je ne sais pas comment procéder en recherchant les valeurs des dictats dans la liste.
{ 'Jason': {'id': '1234'}, 'Tom': {'id': '1245'}, ...}
- être ?){'1234': {'name': 'Jason'}, ...}
. Non pas que cela aiderait ce cas d'utilisation.Réponses:
Si vous avez besoin de récupérer à plusieurs reprises le nom, vous devez les indexer par nom (en utilisant un dictionnaire), de cette façon, les opérations d' obtention seraient le temps O (1). Une idée:
la source
next()
pour cela me semble bizarre), le but est juste d'obtenir l'index. En outre, cela déclenche StopIteration, tandis que lalst.index()
méthode Python déclenche ValueError.first()
ça sonne mieux. Vous pouvez toujours essayer / sauf StopIteration et lever ValueError pour que l'appelant soit cohérent. Vous pouvez également définirnext()
la valeur par défaut de -1.SyntaxError: Generator expression must be parenthesized if not sole argument
en faisant ça.next((index for (index, d) in enumerate(lst) if d["name"] == "Tom"), None)
Une version lisible simple est
la source
str.find()
bien. Vous pouvez également l'appelerindex()
et augmenter aValueError
au lieu de renvoyer -1 si cela était préférable.Ce ne sera pas efficace, car vous devez parcourir la liste en vérifiant tous les éléments qu'elle contient (O (n)). Si vous voulez de l'efficacité, vous pouvez utiliser des dictées . Sur la question, voici une façon possible de la trouver (cependant, si vous voulez vous en tenir à cette structure de données, il est en fait plus efficace d' utiliser un générateur comme Brent Newey l'a écrit dans les commentaires; voir aussi la réponse de tokland):
la source
Voici une fonction qui trouve la position d'index du dictionnaire si elle existe.
la source
Il semble plus logique d'utiliser un combo filtre / index:
Et si vous pensez qu'il pourrait y avoir plusieurs correspondances:
la source
La réponse offerte par @faham est une belle ligne unique, mais elle ne renvoie pas l'index du dictionnaire contenant la valeur. Au lieu de cela, il renvoie le dictionnaire lui-même. Voici un moyen simple d'obtenir: Une liste d'index un ou plusieurs s'il y en a plus d'un, ou une liste vide s'il n'y en a pas:
Production:
Ce que j'aime dans cette approche, c'est qu'avec une simple modification, vous pouvez obtenir une liste des index et des dictionnaires sous forme de tuples. C'est le problème que j'avais besoin de résoudre et j'ai trouvé ces réponses. Dans ce qui suit, j'ai ajouté une valeur en double dans un dictionnaire différent pour montrer comment cela fonctionne:
Production:
Cette solution trouve tous les dictionnaires contenant «Tom» dans l'une de leurs valeurs.
la source
Bon mot!?
la source
Pour un itérable donné,
more_itertools.locate
donne les positions des éléments qui satisfont un prédicat.more_itertools
est une bibliothèque tierce qui implémente les recettes itertools parmi d'autres outils utiles.la source
la source