Question Trouver l'index d'un item donné une liste le contenant en Python


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


2238
2017-10-07 01:39


origine


Réponses:


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

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

Les mises en garde suivent

Notez que bien que ce soit peut-être le moyen le 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 que je l'ai utilisé dans la colère. Il m'a été signalé dans les commentaires que, parce que cette réponse est fortement référencée, elle devrait être plus complète. Quelques mises en garde à propos de list.index suivre. Il est probablement utile de jeter d'abord un coup d'oeil à la docstring pour cela:

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

Temps-complexité linéaire dans la liste

Un index L'appel 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ù elle se trouve dans la liste, cette recherche pourrait devenir un goulot d'étranglement. Dans ce cas, vous devriez envisager une structure de données différente. Notez que si vous savez à peu près où trouver le match, vous pouvez donner index un soupçon. Par exemple, dans cet extrait, l.index(999_999, 999_990, 1_000_000) est d'environ cinq ordres de grandeur plus vite que directement l.index(999_999), parce que le premier doit seulement chercher 10 entrées, tandis que le dernier 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'index du premier match à son argument

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

>>> [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'avais autrefois utilisé index, J'utilise maintenant une expression de liste ou une expression de générateur parce qu'elles sont plus généralisables. Donc, si vous envisagez d'atteindre index, jetez un oeil à ces excellentes fonctionnalités de python.

Lève si l'élément n'est pas présent dans la liste

Un appel à index résultats dans un ValueError si l'article 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 ne figure pas dans la liste, vous devez soit

  1. Vérifiez d'abord avec item in my_list (approche propre et lisible), ou
  2. Envelopper le index appeler dans un try/except bloquer qui attrape ValueError (probablement plus rapide, au moins lorsque la liste à rechercher est longue et que l'élément est généralement présent.)

3299
2017-10-07 01:40



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
 |

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


785
2017-10-07 13:19



La majorité des réponses expliquent comment trouver un seul index, mais leurs méthodes ne retournent pas plusieurs index si l'élément est dans la liste plusieurs fois. Utilisation enumerate():

for i, j in enumerate(['foo', 'bar', 'baz']):
    if j == 'bar':
        print(i)

le index() La fonction retourne uniquement la première occurrence enumerate() renvoie toutes les occurrences.

Comme une compréhension de liste:

[i for i, j in enumerate(['foo', 'bar', 'baz']) if j == 'bar']

Voici une autre petite solution avec itertools.count() (qui est à peu près la même approche qu'énumérer):

from itertools import izip as zip, count # izip for maximum efficiency
[i for i, j in zip(count(), ['foo', 'bar', 'baz']) if j == 'bar']

Ceci est plus efficace pour les listes plus grandes que l'utilisation enumerate():

$ python -m timeit -s "from itertools import izip as zip, count" "[i for i, j in zip(count(), ['foo', 'bar', 'baz']*500) if j == 'bar']"
10000 loops, best of 3: 174 usec per loop
$ python -m timeit "[i for i, j in enumerate(['foo', 'bar', 'baz']*500) if j == 'bar']"
10000 loops, best of 3: 196 usec per loop

446
2018-06-19 22:31



Pour obtenir tous les index:

 indexes = [i for i,x in enumerate(xs) if x == 'foo']

123
2018-06-25 15:07



index()retourne le premier indice de valeur!

| indice(...)
   | L.index (valeur, [start, [stop]]) -> entier - retourne le premier index de 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"])

105
2017-08-30 09:40



Un problème surviendra si l'élément n'est pas dans la liste. Cette fonction gère le problème:

# if element is found it returns index of element else returns None

def find_element_in_list(element, list_element):
    try:
        index_element = list_element.index(element)
        return index_element
    except ValueError:
        return None

67
2018-04-16 10:19



a = ["foo","bar","baz",'bar','any','much']

indexes = [index for index in range(len(a)) if a[index] == 'bar']

57
2017-08-21 12:01