web-dev-qa-db-fra.com

Python: Trouver dans la liste

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:?

424
Stephane Rolland

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.

Vérifier si quelque chose est à l'intérieur

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

Filtrer une collection

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.

Trouver la première occurrence

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])

Trouver l'emplacement d'un article

Pour les listes, il y a aussi la méthode index qui peut parfois être utile si vous voulez savoir 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]
927
Niklas B.

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)
139
Janusz Skonieczny

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])
14
Vincent Cantin

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  
7
Antony Hatchkins

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.

2
Engineero
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")
1
Rekha V

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é.

0
Taylor

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)
0
josef

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.

0
Stephane Rolland