Je suis tombé sur ceci:
item = someSortOfSelection()
if item in myList:
doMySpecialFunction(item)
mais parfois cela ne fonctionne pas avec tous mes éléments, comme s'ils n'étaient pas reconnus dans la liste (quand c'est une liste de chaîne).
Est - ce la façon la plus « pythonique » de trouver un élément dans une liste: if x in l:
?
myList
.Réponses:
Quant à votre première question: ce code est parfaitement bien et devrait fonctionner s'il
item
est égal à l'un des éléments à l'intérieurmyList
. Peut-être que vous essayez de trouver une chaîne qui ne correspond pas exactement à l'un des éléments ou que vous utilisez une valeur flottante qui souffre d'inexactitude.Quant à votre deuxième question: il existe en fait plusieurs façons possibles de "trouver" des choses dans les listes.
Vérifier si quelque chose est à l'intérieur
Voici le cas d'utilisation que vous décrivez: Vérifier si quelque chose se trouve dans une liste ou non. Comme vous le savez, vous pouvez utiliser l'
in
opérateur pour cela:Filtrer une collection
Autrement dit, trouver tous les éléments dans une séquence qui remplissent une certaine condition. Vous pouvez utiliser la compréhension de liste ou des expressions génératrices pour cela:
Ce dernier renverra un générateur que vous pouvez imaginer comme une sorte de liste paresseuse qui ne sera construite que lorsque vous l'itérerez. Soit dit en passant, le premier est exactement équivalent à
en Python 2. Ici, vous pouvez voir des fonctions d'ordre supérieur à l'œuvre. En Python 3,
filter
ne renvoie pas de liste, mais un objet de type générateur.Trouver la première occurrence
Si vous ne voulez que la première chose qui corresponde à une condition (mais vous ne savez pas encore ce que c'est), c'est bien d'utiliser une boucle for (éventuellement en utilisant également la
else
clause, qui n'est pas vraiment bien connue). Vous pouvez aussi utiliserqui retournera la première correspondance ou lèvera un
StopIteration
si aucun n'est trouvé. Vous pouvez également utiliserRecherche de l'emplacement d'un élément
Pour les listes, il y a aussi la
index
méthode qui peut parfois être utile si vous voulez savoir où se trouve un certain élément dans la liste:Cependant, notez que si vous avez des doublons,
.index
renvoie toujours l'index le plus bas: ......S'il y a des doublons et que vous voulez tous les index, vous pouvez utiliser à la
enumerate()
place:la source
if x in list
n'est pas la chose que les gens se plaignent de ne pas être une fonction intégrée. Ils se plaignent du fait qu'il n'existe aucun moyen explicite de trouver la première occurrence de quelque chose dans une liste qui correspond à une certaine condition. Mais comme indiqué dans ma réponse,next()
peut être (ab) utilisé pour cela.[list comprehension...][0]
approcheindex()
appelerkey
qui fonctionnait commekey
accepté parmax()
; par exemple:index(list, key=is_prime)
.Si vous voulez trouver un élément ou
None
utiliser la valeur par défaut dansnext
, il ne se lèvera pasStopIteration
si l'élément n'a pas été trouvé dans la liste:la source
next
prend un itérateur comme premier paramètre et une liste / tuple n'est PAS un itérateur. Il devrait donc êtrefirst_or_default = next(iter([x for x in lst if ...]), None)
voir docs.python.org/3/library/functions.html#next(x for x in lst if ...)
c'est un générateur sur la listelst
(qui est un itérateur). Si vous le faitesnext(iter([x for x in lst if ...]), None)
, vous devez construire la liste[x for x in lst if ...]
, ce qui sera une opération beaucoup plus coûteuse.if
dans un lambda et vous pouvez écrirefind(fn,list)
généralement au lieu de masquer le code du générateur.Bien que la réponse de Niklas B. soit assez complète, lorsque nous voulons trouver un élément dans une liste, il est parfois utile d'obtenir son index:
la source
Trouver la première occurrence
Il y a une recette pour ça dans
itertools
:Par exemple, le code suivant recherche le premier nombre impair dans une liste:
la source
Une autre alternative: vous pouvez vérifier si un élément est dans une liste avec
if item in list:
, mais c'est l'ordre O (n). Si vous avez affaire à de grandes listes d'éléments et que tout ce que vous devez savoir est si quelque chose fait partie de votre liste, vous pouvez d'abord convertir la liste en un ensemble et profiter de la recherche d'un ensemble de temps constant :Cela ne sera pas la bonne solution dans tous les cas, mais dans certains cas, cela pourrait vous donner de meilleures performances.
Notez que la création de l'ensemble avec
set(my_list)
est également O (n), donc si vous n'avez besoin de le faire qu'une seule fois, il n'est pas plus rapide de le faire de cette façon. Si vous devez vérifier à plusieurs reprises l'appartenance, ce sera O (1) pour chaque recherche après la création de l'ensemble initial.la source
Vous souhaiterez peut-être utiliser l'une des deux recherches possibles lorsque vous travaillez avec une liste de chaînes:
si l'élément de liste est égal à un élément ('exemple' est dans ['un', 'exemple', 'deux']):
if item in your_list: some_function_on_true()
'ex' dans ['un', 'ex', 'deux'] => Vrai
'ex_1' dans ['un', 'ex', 'deux'] => Faux
si l'élément de liste est comme un élément ('ex' est dans ['un,' exemple ',' deux '] ou' exemple_1 'est dans [' un ',' exemple ',' deux ']):
matches = [el for el in your_list if item in el]
ou
matches = [el for el in your_list if el in item]
vérifiez-les
len(matches)
ou lisez-les si nécessaire.la source
Définition et utilisation
la
count()
méthode renvoie le nombre d'éléments avec la valeur spécifiée.Syntaxe
exemple:
Exemple de question:
la source
Au lieu d'utiliser
list.index(x)
qui renvoie l'index de x s'il se trouve dans la liste ou renvoie un#ValueError
message si x n'est pas trouvé, vous pouvez utiliserlist.count(x)
qui renvoie le nombre d'occurrences de x dans la liste (validation que x est bien dans la liste) ou renvoie 0 sinon (en l'absence de x). Ce qui est cool,count()
c'est qu'il ne casse pas votre code ou vous oblige à lever une exception lorsque x n'est pas trouvéla source
Si vous allez vérifier si la valeur existe une fois dans la collection, alors utiliser l'opérateur 'in' est correct. Cependant, si vous allez vérifier plus d'une fois, je vous recommande d'utiliser le module bissect. Gardez à l'esprit que l'utilisation des données du module bissect doit être triée. Vous triez donc les données une fois et vous pouvez ensuite utiliser la bissect. L'utilisation du module bissect sur ma machine est environ 12 fois plus rapide que l'utilisation de l'opérateur 'in'.
Voici un exemple de code utilisant Python 3.8 et la syntaxe ci-dessus:
Production:
la source
Vérifiez qu'il n'y a pas d'espace blanc supplémentaire / indésirable dans les éléments de la liste des chaînes. C'est une raison qui peut interférer en expliquant que les articles sont introuvables.
la source