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)