Pregunta Encontrar el índice de un artículo dado una lista que lo contiene en Python


Para una lista ["foo", "bar", "baz"] y un elemento en la lista "bar"¿Cómo obtengo su índice (1) en Python?


2238
2017-10-07 01:39


origen


Respuestas:


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

Referencia: Data Structures> Más sobre listas

Las advertencias siguen

Tenga en cuenta que, si bien esta es quizás la forma más limpia de responder a la pregunta como se le preguntó, index es un componente bastante débil de la list API, y no puedo recordar la última vez que lo usé con enojo. Se me ha señalado en los comentarios que, debido a que esta respuesta está fuertemente referenciada, debería hacerse más completa. Algunas advertencias sobre list.index seguir. Probablemente valga la pena inicialmente echarle un vistazo a la carpeta de documentos:

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

Tiempo lineal-complejidad en la longitud de la lista

Un index llamada comprueba cada elemento de la lista en orden, hasta que encuentra una coincidencia. Si su lista es larga y no sabe aproximadamente en qué parte de la lista aparece, esta búsqueda podría convertirse en un cuello de botella. En ese caso, debe considerar una estructura de datos diferente. Tenga en cuenta que si sabe aproximadamente dónde encontrar el partido, puede dar index una pista. Por ejemplo, en este fragmento, l.index(999_999, 999_990, 1_000_000) es aproximadamente cinco órdenes de magnitud más rápido que derecho l.index(999_999), porque el primero solo tiene que buscar 10 entradas, mientras que el segundo busca un millón:

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

Solo devuelve el índice del primer partido a su argumento

Una llamada a index busca en la lista en orden hasta que encuentre una coincidencia, y se detiene allí. Si espera necesitar índices de más coincidencias, debe usar una lista de comprensión o expresión del generador.

>>> [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 mayoría de los lugares donde una vez habría usado indexAhora uso una lista de comprensión o expresión de generador porque son más generalizables. Entonces, si estás considerando alcanzar index, eche un vistazo a estas excelentes características de Python.

Lanza si el elemento no está presente en la lista

Una llamada a index resultados en una ValueError si el artículo no está presente

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

Si el artículo no está presente en la lista, debe

  1. Compruébalo primero con item in my_list (enfoque limpio y legible), o
  2. Envuelva el index llamar en un try/except bloque que atrapa ValueError (Probablemente más rápido, al menos cuando la lista para buscar es larga, y el elemento suele estar presente).

3299
2017-10-07 01:40



Una cosa que es realmente útil para aprender Python es usar la función de ayuda interactiva:

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

class list(object)
 ...

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

que a menudo lo llevará al método que está buscando.


785
2017-10-07 13:19



La mayoría de las respuestas explican cómo encontrar un solo índice, pero sus métodos no devuelven índices múltiples si el artículo está en la lista varias veces. Utilizar enumerate():

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

los index() la función solo devuelve la primera ocurrencia, mientras enumerate() devuelve todas las ocurrencias.

Como una lista de comprensión:

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

Aquí hay otra pequeña solución con itertools.count() (que es más o menos el mismo enfoque que enumerate):

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

Esto es más eficiente para listas más grandes que el uso 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



Para obtener todos los índices:

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

123
2018-06-25 15:07



index()devuelve el primero índice de valor!

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

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 problema surgirá si el elemento no está en la lista. Esta función maneja el problema:

# 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



Debes establecer una condición para verificar si el elemento que estás buscando está en la lista

if 'your_element' in mylist:
    print mylist.index('your_element')
else:
    print None

39
2018-05-26 04:26



Todas las funciones propuestas aquí reproducen el comportamiento inherente del lenguaje pero oscurecen lo que está sucediendo.

[i for i in range(len(mylist)) if mylist[i]==myterm]  # get the indices

[each for each in mylist if each==myterm]             # get the items

mylist.index(myterm) if myterm in mylist else None    # get the first index and fail quietly

¿Por qué escribir una función con manejo de excepciones si el lenguaje proporciona los métodos para hacer lo que usted quiere?


34
2018-05-16 16:45