Вопрос-Ответ

How to find all occurrences of an element in a list

Как найти все вхождения элемента в списке

index() выдаст первое вхождение элемента в списке. Есть ли изящный трюк, который возвращает все индексы в списке для элемента?

Переведено автоматически
Ответ 1

Вы можете использовать понимание списка с помощью enumerate:

indices = [i for i, x in enumerate(my_list) if x == "whatever"]

Итератор enumerate(my_list) выдает пары (index, item) для каждого элемента в списке. Использование i, x в качестве переменной цикла target распаковывает эти пары в индекс i и элемент списка x. Мы отфильтровываем все, x которые соответствуют нашему критерию, и выбираем индексы i этих элементов.

Ответ 2

Хотя это и не решение для списков напрямую, numpy действительно подходит для такого рода задач:

import numpy as np
values = np.array([1,2,3,1,2,4,5,6,3,2,1])
searchval = 3
ii = np.where(values == searchval)[0]

ВОЗВРАТ:

ii ==>array([2, 8])

Это может быть значительно быстрее для списков (массивов) с большим количеством элементов по сравнению с некоторыми другими решениями.

Ответ 3

Решение с использованием list.index:

def indices(lst, element):
result = []
offset = -1
while True:
try:
offset = lst.index(element, offset+1)
except ValueError:
return result
result.append(offset)

Это намного быстрее, чем понимание списка с помощью enumerate для больших списков. Это также намного медленнее, чем numpy решение, если у вас уже есть массив, в противном случае стоимость преобразования перевешивает выигрыш в скорости (проверено на списках целых чисел со 100, 1000 и 10000 элементами).

ПРИМЕЧАНИЕ: Предостережение, основанное на комментарии Chris_Rands: это решение быстрее, чем понимание списка, если результаты достаточно разрежены, но если в списке много экземпляров элемента, который ищется (более ~ 15% списка, в тесте со списком из 1000 целых чисел), понимание списка происходит быстрее.

Ответ 4

Как насчет:

In [1]: l=[1,2,3,4,3,2,5,6,7]

In [2]: [i for i,val in enumerate(l) if val==3]
Out[2]: [2, 4]
python list