Trouver l'indice d'un élément dans une liste qui le contient en Python

Pour une liste ["foo&quot ;, "bar&quot ;, "baz&quot ;] et un élément de la liste "bar", comment puis-je obtenir son index (1) en Python ?

Solution
>>> ["foo", "bar", "baz"].index("bar")
1

Référence : Structures de données > Plus de listes

Les avertissements suivent

Notez que même si c'est peut-être la façon la plus propre de répondre à la question telle que posée, index est un composant plutôt faible de l'API list, et je ne me souviens pas de la dernière fois où je l'ai utilisé en colère. On m'a fait remarquer dans les commentaires qu'étant donné que cette réponse est fortement référencée, elle devrait être plus complète. Quelques avertissements à propos de list.index suivent. Cela vaut probablement la peine de jeter un coup d'oeil à la docstring de cette fonction :

>>> print(list.index.__doc__)
L.index(value, [start, [stop]]) -> integer -- return first index of value.
Raises ValueError if the value is not present.

Complexité temporelle linéaire en fonction de la longueur de la liste

Un appel index vérifie chaque élément de la liste dans l'ordre, jusqu'à ce qu'il trouve une correspondance. Si votre liste est longue, et que vous ne savez pas à peu près où dans la liste se trouve la correspondance, cette recherche peut devenir un goulot d'étranglement. Dans ce cas, vous devez envisager une structure de données différente. Notez que si vous savez à peu près où trouver la correspondance, vous pouvez donner un indice à index. Par exemple, dans cet extrait, l.index(999_999, 999_990, 1_000_000) est environ cinq ordres de grandeur plus rapide que l.index(999_999) direct, parce que le premier n'a à chercher que 10 entrées, alors que le second en cherche un million :

>>> import timeit
>>> timeit.timeit('l.index(999_999)', setup='l = list(range(0, 1_000_000))', number=1000)
9.356267921015387
>>> timeit.timeit('l.index(999_999, 999_990, 1_000_000)', setup='l = list(range(0, 1_000_000))', number=1000)
0.0004404920036904514

Ne retourne que l'index de la première correspondance avec son argument.

Un appel à index cherche dans la liste dans l'ordre jusqu'à ce qu'il trouve une correspondance, et s'arrête là. Si vous pensez avoir besoin des indices de plus de correspondances, vous devriez utiliser une compréhension de liste, ou une expression génératrice.

>>> [1, 1].index(1)
0
>>> [i for i, e in enumerate([1, 2, 1]) if e == 1]
[0, 2]
>>> g = (i for i, e in enumerate([1, 2, 1]) if e == 1)
>>> next(g)
0
>>> next(g)
2

La plupart des endroits où j'aurais utilisé index, j'utilise maintenant une compréhension de liste ou un générateur d'expression parce qu'ils sont plus généralisables. Donc, si vous envisagez d'utiliser index, jetez un coup d'oeil à ces excellentes fonctionnalités de Python.

Lance une requête si un élément n'est pas présent dans la liste

Un appel à index résulte en une ValueError si l'élément n'est pas présent.

>>> [1, 1].index(2)
Traceback (most recent call last):
  File "", line 1, in 
ValueError: 2 is not in list

Si l'élément risque de ne pas être présent dans la liste, vous devez soit

  1. Le vérifier d'abord avec item in my_list (approche propre et lisible), soit
  2. Envelopper l'appel index dans un bloc try/except qui attrape ValueError (probablement plus rapide, au moins quand la liste à rechercher est longue, et que l'élément est habituellement présent.)
Commentaires (2)

Une chose qui est vraiment utile pour apprendre Python est d'utiliser la fonction d'aide interactive :

>>> help(["foo", "bar", "baz"])
Help on list object:

class list(object)
 ...

 |
 |  index(...)
 |      L.index(value, [start, [stop]]) -> integer -- return first index of value
 |

qui vous mènera souvent à la méthode que vous recherchez.

Commentaires (1)

index() renvoie le premier indice de la valeur !

| index(...) | L.index(valeur, [start, [stop]]) -> integer -- retourne le premier indice de la valeur

def all_indices(value, qlist):
    indices = []
    idx = -1
    while True:
        try:
            idx = qlist.index(value, idx+1)
            indices.append(idx)
        except ValueError:
            break
    return indices

all_indices("foo", ["foo","bar","baz","foo"])
Commentaires (3)