J'ai rencontré 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 il s'agit d'une liste de chaînes).
Est-ce la façon la plus «pythonique» de trouver un élément dans une liste: if x in l:
?
En ce qui concerne votre première question: ce code convient parfaitement et devrait fonctionner si item
est égal à l’un des éléments contenus dans myList
. Peut-être essayez-vous de trouver une chaîne qui ne correspond pas exactement à l'un des éléments ou utilisez-vous une valeur float qui souffre d'inexactitude.
En ce qui concerne votre deuxième question: il existe en fait plusieurs manières possibles de "trouver" des choses dans des listes.
Voici le cas d'utilisation que vous décrivez: Vérifier si quelque chose est dans une liste ou non. Comme vous le savez, vous pouvez utiliser l'opérateur in
pour cela:
3 in [1, 2, 3] # => True
C'est-à-dire trouver tous les éléments d'une séquence qui remplissent une certaine condition. Vous pouvez utiliser des expressions de compréhension de liste ou de générateur pour cela:
matches = [x for x in lst if fulfills_some_condition(x)]
matches = (x for x in lst if x > 6)
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. Par ailleurs, le premier est exactement équivalent à
matches = filter(fulfills_some_condition, lst)
en Python 2. Vous pouvez voir ici des fonctions d'ordre supérieur au travail. En Python 3, filter
ne renvoie pas de liste, mais un objet de type générateur.
Si vous voulez seulement la première chose qui corresponde à une condition (mais vous ne savez pas encore ce que c'est), vous pouvez utiliser une boucle for (vous pouvez également utiliser la clause else
, qui n'est pas vraiment connue). Vous pouvez aussi utiliser
next(x for x in lst if ...)
qui renverra le premier match ou déclenchera une StopIteration
si aucun n'est trouvé. Alternativement, vous pouvez utiliser
next((x for x in lst if ...), [default value])
Pour les listes, il y a aussi la méthode index
qui peut parfois être utile si vous voulez savoir où un certain élément est dans la liste:
[1,2,3].index(2) # => 1
[1,2,3].index(4) # => ValueError
Cependant, notez que si vous avez des doublons, .index
renvoie toujours l'index le plus bas: ......
[1,2,3,2].index(2) # => 1
S'il y a des doublons et que vous voulez tous les index, vous pouvez utiliser enumerate()
à la place:
[i for i,x in enumerate([1,2,3,2]) if x==2] # => [1, 3]
Si vous voulez trouver un élément ou None
utiliser default par next
, la StopIteration
ne sera pas levée si l'élément n'a pas été trouvé dans la liste:
first_or_default = next((x for x in lst if ...), None)
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:
next((i for i, x in enumerate(lst) if [condition on x]), [default value])
Trouver la première occurrence
Il existe une recette pour cela dans itertools
:
def first_true(iterable, default=False, pred=None):
"""Returns the first true value in the iterable.
If no true value is found, returns *default*
If *pred* is not None, returns the first item
for which pred(item) is true.
"""
# first_true([a,b,c], x) --> a or b or c or x
# first_true([a,b], x, f) --> a if f(a) else b if f(b) else x
return next(filter(pred, iterable), default)
Par exemple, le code suivant trouve le premier nombre impair dans une liste:
>>> first_true([2,3,4,5], None, lambda x: x%2==1)
3
Une autre alternative: vous pouvez vérifier si un élément est dans une liste avec if item in list:
, mais il s'agit de l'ordre O (n). Si vous avez affaire à de grandes listes d’éléments et que tout ce que vous avez à savoir est de savoir si quelque chose en fait partie, vous pouvez d'abord convertir la liste en un ensemble et tirer parti de recherche constante de l'ensemble de temps :
my_set = set(my_list)
if item in my_set: # much faster on average than using a list
# do something
La solution ne sera pas toujours appropriée, mais dans certains cas, cela peut vous donner de meilleures performances.
Notez que la création de l'ensemble avec set(my_list)
est également O (n), donc si vous ne devez le faire qu'une fois, il n'est pas plus rapide de le faire de cette façon. Cependant, si vous devez vérifier de manière répétée l'appartenance, il s'agira de O(1) pour chaque recherche effectuée après la création de cet ensemble initial.
list = [10, 20, 30, 40, 50]
n = int(input("\nEnter a Number to search from the list : "))
if n in list :
print("\nMatch found")
else :
print("\nMatch not found")
Au lieu d'utiliser list.index(x)
qui retourne l'index de x s'il se trouve dans la liste ou renvoie un message #ValueError
si x n'est pas trouvé, vous pouvez utiliser list.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). La bonne chose à propos de count()
est qu’il ne casse pas votre code et ne vous oblige pas à lancer une exception lorsque x n’est pas trouvé.
Définition et utilisation
la méthode count()
renvoie le nombre d'éléments avec la valeur spécifiée.
Syntaxe
list.count(value)
Exemple:
fruits = ['Apple', 'banana', 'cherry']
x = fruits.count("cherry")
Exemple de question:
item = someSortOfSelection()
if myList.count(item) >= 1 :
doMySpecialFunction(item)
Vérifiez qu'il n'y a pas d'espaces blancs supplémentaires/indésirables dans les éléments de la liste de chaînes . C'est une raison qui peut interférer en expliquant que les éléments sont introuvables.