답변:
목록 이해를 사용할 수 있습니다.
indices = [i for i, x in enumerate(my_list) if x == "whatever"]
enumerate
2.3 에서 나타났습니다 . 예, 파이썬이 고대라면을 사용하십시오 filter()
.
print([i for i, x in enumerate([[1,1],[0,1]]) if x == 1])
반환 []
합니다 [[0, 1], [0, 0], [1, 1]]
.
(a == 1).nonzero()
NumPy 배열을 사용하는 것을 허용하는 NumPy 사용을 고려해야 a
합니다.
직접 목록에 대한 해결책은 아니지만 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])
이것은 다른 솔루션에 비해 많은 수의 요소가있는 목록 (배열)의 경우 훨씬 빠릅니다.
[0]
은 필요 where
합니다. 튜플을 반환하기 때문입니다(array([2, 8], dtype=int64),)
all_id_resp_address
는 np.array
안됩니다 list
.
list
하고 str
, 분명 당신은 전달 False
에 np.where
. 당신 np.array
이 smth와 비교할 때 . 부울 값의 배열을 얻습니다. 그런 다음 해당 배열 np.where
의 모든 True
값 위치를 찾습니다 .
다음을 사용하는 솔루션 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 개의 정수 목록이있는 테스트에서) 목록 이해가 더 빠릅니다.
timeit.timeit
무작위로 생성 된 목록과 함께 사용되었을 것입니다 . 그것은 중요한 점이지만, 그것이 당신이 묻는 이유 일 것입니다. 당시에는 그것이 발생하지 않았지만 결과가 충분히 희박한 경우에만 속도 증가가 사실입니다. 방금 검색 할 요소로 가득 찬 목록으로 테스트했으며 목록 이해보다 훨씬 느립니다.
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
입니다.
conda install
최근 성능이 매우 불안정 해졌 지만 )
python2에서 filter () 사용.
>>> q = ['Yeehaw', 'Yeehaw', 'Googol', 'B9', 'Googol', 'NSM', 'B9', 'NSM', 'Dont Ask', 'Googol']
>>> filter(lambda i: q[i]=="Googol", range(len(q)))
[2, 4, 9]
enumerate (alist)를 사용하면 요소 x가 찾는 것과 같을 때 목록의 인덱스 인 첫 번째 요소 (n)를 저장할 수 있습니다.
>>> alist = ['foo', 'spam', 'egg', 'foo']
>>> foo_indexes = [n for n,x in enumerate(alist) if x=='foo']
>>> foo_indexes
[0, 3]
>>>
이 함수는 항목과 목록을 인수로 사용하여 이전에 본 것처럼 목록에서 항목의 위치를 반환합니다.
def indexlist(item2find, list_or_string):
"Returns all indexes of an item in a list or a string"
return [n for n,item in enumerate(list_or_string) if item==item2find]
print(indexlist("1", "010101010"))
산출
[1, 3, 5, 7]
for n, i in enumerate([1, 2, 3, 4, 1]):
if i == 1:
print(n)
산출:
0
4
for-loop
:enumerate
및 목록 이해 보다 효율적이고 파이썬, 그러나,이 답변은 그 중 일부를 사용 할 수 없습니다 학생들을 대상으로 내장 된 기능을 .indices
for i in range(len(x)):
기본적으로 인덱스 위치 목록을 반복합니다.[0, 1, 2, 3, ..., len(x)-1]
i
곳 을x[i]
value
indices
x[i]
색인으로 목록에 액세스def get_indices(x: list, value: int) -> list:
indices = list()
for i in range(len(x)):
if x[i] == value:
indices.append(i)
return indices
n = [1, 2, 3, -50, -60, 0, 6, 9, -60, -60]
print(get_indices(n, -60))
>>> [4, 8, 9]
get_indices
는 type hints 로 구현됩니다 . 이 경우, 목록에서 n
의 무리입니다 int
들, 그러므로 우리는 검색 value
도 정의,int
.while-loop
및 .index
:.index
사용 try-except
에 대한 오류 처리 a는 때문에 ValueError
경우에 발생합니다 value
목록에 없습니다.def get_indices(x: list, value: int) -> list:
indices = list()
i = 0
while True:
try:
# find an occurrence of value and update i to that index
i = x.index(value, i)
# add i to the list
indices.append(i)
# advance i by 1
i += 1
except ValueError as e:
break
return indices
print(get_indices(n, -60))
>>> [4, 8, 9]
get_indeices
는 일반 목록 이해보다 약간 빠릅니다 (~ 15 %). 나는 그것을 알아 내려고 노력하고있다.
Python 2를 사용하는 경우 다음과 동일한 기능을 수행 할 수 있습니다.
f = lambda my_list, value:filter(lambda x: my_list[x] == value, range(len(my_list)))
my_list
색인을 가져 오려는 목록은 어디에 있고 value
검색된 값입니다. 용법:
f(some_list, some_element)