>>> ["foo", "bar", "baz"].index("bar")
1
Référence : Structures de données > Plus sur les listes
Les mises en garde suivantes
Notez que même si c'est peut-être la façon la plus propre de répondre à la question comme demandé , index
est une composante plutôt faible de la list
API, 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 que, comme cette réponse est fortement référencée, elle devrait être plus complète. Quelques mises en garde concernant list.index
suivre. Cela vaut probablement la peine de jeter un coup d'œil à la documentation correspondante :
list.index(x[, start[, end]])
Retourne l'indice basé sur zéro dans la liste du premier élément dont la valeur est égale à x . Lève un ValueError
s'il n'existe pas d'élément de ce type.
Les arguments facultatifs commencer y fin sont interprétés comme dans le notation des tranches et sont utilisés pour limiter la recherche à une sous-séquence particulière de la liste. L'indice retourné est calculé par rapport au début de la séquence complète plutôt que par rapport à l'argument start.
Complexité temporelle linéaire en fonction de la longueur de la liste
Un site 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ù se trouve la correspondance dans la liste, 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 à la fonction index
un indice. Par exemple, dans cet extrait, l.index(999_999, 999_990, 1_000_000)
est environ cinq ordres de grandeur plus rapide que le droit l.index(999_999)
car le premier ne doit 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
Renvoie uniquement l'indice de l'élément premier match à son argument
Un appel à index
recherche dans la liste dans l'ordre jusqu'à ce qu'il trouve une correspondance, et s'arrête là. Si vous prévoyez d'avoir besoin d'indices pour un plus grand nombre de correspondances, vous devez utiliser une liste de compréhension 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 autrefois utilisé index
J'utilise maintenant une compréhension de liste ou une expression de générateur parce qu'elles sont plus généralisables. Donc si vous envisagez d'utiliser index
, jetez un coup d'œil à ces excellentes fonctionnalités de Python.
Déclenche une erreur si l'élément n'est pas présent dans la liste
Un appel à index
donne lieu à un ValueError
si l'élément n'est pas présent.
>>> [1, 1].index(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 2 is not in list
Si l'élément n'est pas présent dans la liste, vous devez soit
- Vérifiez-le d'abord avec
item in my_list
(approche propre et lisible), ou
- Enveloppez le
index
appeler dans un try/except
qui attrape ValueError
(probablement plus rapide, du moins lorsque la liste à rechercher est longue, et que l'élément est généralement présent).
16 votes
Est-ce que vous renvoyez : [1] L'indice le plus bas au cas où il y a plusieurs instances de
"bar"
, [2] Tous les indices de"bar"
?8 votes
A) Est-il garanti que l'élément est dans la liste, ou sinon comment devons-nous gérer le cas d'erreur ? (return None/ raise ValueError) b) Est-il garanti que les entrées de la liste sont uniques, et devons-nous retourner le premier indice d'une correspondance, ou tous les indices ?
1 votes
Voir les réponses avec l'intégration de numpy, les tableaux numpy sont beaucoup plus efficaces que les listes Python. Si la liste est courte, il n'y a aucun problème à en faire une copie à partir d'une liste Python, si elle ne l'est pas, vous devriez peut-être envisager de stocker les éléments dans un tableau numpy en premier lieu.