Поиск индекса элемента по списку, содержащему его в Python - PullRequest
2683 голосов
/ 07 октября 2008

Для списка ["foo", "bar", "baz"] и элемента в списке "bar", как мне получить его индекс (1) в Python?

Ответы [ 28 ]

5 голосов
/ 26 мая 2018

Поиск индекса элемента x в списке L:

idx = L.index(x) if (x in L) else -1
3 голосов
/ 07 марта 2018

На это есть более функциональный ответ.

list(filter(lambda x: x[1]=="bar",enumerate(["foo", "bar", "baz", "bar", "baz", "bar", "a", "b", "c"])))

Более общая форма:

def get_index_of(lst, element):
    return list(map(lambda x: x[0],\
       (list(filter(lambda x: x[1]==element, enumerate(lst))))))
3 голосов
/ 04 марта 2018

Python index() метод выдает ошибку, если элемент не был найден, что отстой!

Таким образом, вместо этого вы можете сделать его похожим на indexOf() функцию JavaScript, которая возвращает -1, если элемент не был найден:

    try:
        index = array.index('search_keyword')
    except ValueError:
        index = -1
2 голосов
/ 14 ноября 2018

Давайте дадим имя lst списку, который у вас есть. Можно преобразовать список lst в numpy array. И затем используйте numpy.where , чтобы получить индекс выбранного элемента в списке. Ниже описан способ его реализации.

import numpy as np

lst = ["foo", "bar", "baz"]  #lst: : 'list' data type
print np.where( np.array(lst) == 'bar')[0][0]

>>> 1
1 голос
/ 25 сентября 2018

Как указывает @TerryA, во многих ответах обсуждается, как найти один индекс.

more_itertools - сторонняя библиотека с инструментами для поиска нескольких индексов внутри итерируемого.

С учетом

import more_itertools as mit


iterable = ["foo", "bar", "baz", "ham", "foo", "bar", "baz"]

код

Найти индексы множественных наблюдений:

list(mit.locate(iterable, lambda x: x == "bar"))
# [1, 5]

Тестирование нескольких предметов:

list(mit.locate(iterable, lambda x: x in {"bar", "ham"}))
# [1, 3, 5]

См. Также дополнительные параметры с more_itertools.locate. Установить через > pip install more_itertools.

1 голос
/ 10 сентября 2018

Если производительность имеет значение:

В многочисленных ответах упоминается, что встроенный метод list.index(item) является алгоритмом O (n). Это хорошо, если вам нужно выполнить это один раз. Но если вам нужно получить доступ к индексам элементов несколько раз, имеет смысл сначала создать словарь (O (n)) пар элементов-индексов, а затем обращаться к индексу в O (1) каждый раз, когда вам нужно это.

Если вы уверены, что элементы в вашем списке никогда не повторяются, вы можете легко:

myList = ["foo", "bar", "baz"]

# Create the dictionary
myDict = dict((e,i) for i,e in enumerate(myList))

# Lookup
myDict["bar"] # Returns 1
# myDict.get("blah") if you don't want an error to be raised if element not found.

Если у вас могут быть повторяющиеся элементы, и вам необходимо вернуть все их индексы:

from collections import defaultdict as dd
myList = ["foo", "bar", "bar", "baz", "foo"]

# Create the dictionary
myDict = dd(list)
for i,e in enumerate(myList):
    myDict[e].append(i)

# Lookup
myDict["foo"] # Returns [0, 4]
1 голос
/ 31 января 2018

Для тех, кто приходит с другого языка, такого как я, возможно, с простым циклом его легче понять и использовать:

mylist = ["foo", "bar", "baz", "bar"]
newlist = enumerate(mylist)
for index, item in newlist:
  if item == "bar":
    print(index, item)

Я благодарен за Так что же делает перечисление? . Это помогло мне понять.

0 голосов
/ 18 марта 2019

с использованием словаря, где сначала обрабатывается список, а затем добавляется к нему индекс

from collections import defaultdict

index_dict = defaultdict(list)    
word_list =  ['foo','bar','baz','bar','any', 'foo', 'much']

for word_index in range(len(word_list)) :
    index_dict[word_list[word_index]].append(word_index)

word_index_to_find = 'foo'       
print(index_dict[word_index_to_find])

# output :  [0, 5]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...