[python] 목록에서 요소의 모든 항목을 찾는 방법은 무엇입니까?

index()목록에서 항목의 첫 항목 만 제공합니다. 목록의 모든 인덱스를 반환하는 깔끔한 트릭이 있습니까?



답변

목록 이해를 사용할 수 있습니다.

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


답변

직접 목록에 대한 해결책은 아니지만 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])

이것은 다른 솔루션에 비해 많은 수의 요소가있는 목록 (배열)의 경우 훨씬 빠릅니다.


답변

다음을 사용하는 솔루션 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 개의 정수 목록이있는 테스트에서) 목록 이해가 더 빠릅니다.


답변

어때요 :

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]


답변

occurrences = lambda s, lst: (i for i,e in enumerate(lst) if e == s)
list(occurrences(1, [1,2,3,1])) # = [0, 3]


답변

more_itertools.locate 조건을 만족하는 모든 항목에 대한 인덱스를 찾습니다.

from more_itertools import locate


list(locate([0, 1, 1, 0, 1, 0, 0]))
# [1, 2, 4]

list(locate(['a', 'b', 'c', 'b'], lambda x: x == 'b'))
# [1, 3]

more_itertools타사 라이브러리 > pip install more_itertools입니다.


답변

모든 경우에 대한 하나 이상의 솔루션 (중복 된 경우 죄송합니다) :

values = [1,2,3,1,2,4,5,6,3,2,1]
map(lambda val: (val, [i for i in xrange(len(values)) if values[i] == val]), values)