목록 ["foo", "bar", "baz"]
과 목록 에 항목이 주어지면 파이썬에서 "bar"
색인 ( 1
)을 어떻게 얻 습니까?
답변
>>> ["foo", "bar", "baz"].index("bar")
1
참조 : 데이터 구조> 목록에 대한 추가 정보
주의 사항
참고이 아마도 질문에 대답 할 수있는 가장 깨끗한 방법입니다 동안 것을 요청하면서 , index
의 다소 약한 구성 요소 list
API, 그리고 내가 분노를 마지막으로 사용한 시간을 기억할 수 없습니다. 이 답변이 많이 언급 되었기 때문에 더 완벽하게 작성해야한다는 의견에서 나에게 지적되었습니다. list.index
다음과 같은 몇 가지주의 사항이 있습니다. 처음에는 문서를 살펴볼 가치가 있습니다.
list.index(x[, start[, end]])
값이 x 인 첫 번째 항목의 목록에서 0부터 시작하는 인덱스를 반환합니다 .
ValueError
해당 항목이 없으면 a를 발생시킵니다.선택적 인수 start 및 end 는 슬라이스 표기법에서 와 같이 해석되며 검색을 목록의 특정 하위 시퀀스로 제한하는 데 사용됩니다. 반환 된 인덱스는 시작 인수가 아닌 전체 시퀀스의 시작을 기준으로 계산됩니다.
리스트 길이의 선형 시간 복잡성
index
이 일치하는 항목을 찾을 때까지 호출 순서대로 목록의 모든 요소를 확인합니다. 목록이 길고 목록의 대략적인 위치를 모르면이 검색에 병목 현상이 발생할 수 있습니다. 이 경우 다른 데이터 구조를 고려해야합니다. 일치하는 위치를 대략 알면 index
힌트를 줄 수 있습니다 . 예를 들어,이 스 니펫에서는 l.index(999_999, 999_990, 1_000_000)
straight보다 약 5 배 빠릅니다 l.index(999_999)
. 전자는 10 개의 항목 만 검색하고 후자는 백만을 검색하기 때문입니다.
>>> import timeit
>>> timeit.timeit('l.index(999_999)', setup='l = list(range(0, 1_000_000))', number=1000)
9.356267921015387
>>> timeit.timeit('l.index(999_999, 999_990, 1_000_000)', setup='l = list(range(0, 1_000_000))', number=1000)
0.0004404920036904514
인수 와 일치 하는 첫 번째 색인 만 리턴합니다.
index
일치하는 항목을 찾을 때까지 목록을 순서대로 검색하여 호출합니다 . 일치하는 인덱스가 더 필요할 것으로 예상되는 경우 목록 이해 또는 생성기 표현식을 사용해야합니다.
>>> [1, 1].index(1)
0
>>> [i for i, e in enumerate([1, 2, 1]) if e == 1]
[0, 2]
>>> g = (i for i, e in enumerate([1, 2, 1]) if e == 1)
>>> next(g)
0
>>> next(g)
2
한 번 사용했던 대부분의 장소는 index
이제 더 포괄적이기 때문에 목록 이해 또는 생성기 표현을 사용합니다. 에 도달하는 것을 고려하고 있다면 index
이러한 훌륭한 Python 기능을 살펴보십시오.
요소가리스트에없는 경우 발생
항목이없는 경우 호출하면 index
결과가 ValueError
나타납니다.
>>> [1, 1].index(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 2 is not in list
항목이 목록에 없을 수 있으면
item in my_list
(깨끗하고 읽기 쉬운 접근 방식)으로 먼저 확인 하거나- 잡는 블록으로
index
통화를 감싸십시오 (적어도 검색 할 목록이 길고 항목이있는 경우 더 빠름).try/except
ValueError
답변
파이썬을 배우는 데 실제로 도움이되는 한 가지는 대화 형 도움말 함수를 사용하는 것입니다.
>>> help(["foo", "bar", "baz"])
Help on list object:
class list(object)
...
|
| index(...)
| L.index(value, [start, [stop]]) -> integer -- return first index of value
|
종종 당신이 찾고있는 방법으로 이어질 것입니다.
답변
대부분의 답변 은 단일 인덱스 를 찾는 방법을 설명 하지만 항목이 여러 번 목록에 있으면 해당 메소드는 여러 인덱스를 반환하지 않습니다. 사용 enumerate()
:
for i, j in enumerate(['foo', 'bar', 'baz']):
if j == 'bar':
print(i)
이 index()
함수는 첫 번째 항목 만 반환하고 enumerate()
모든 항목은 반환합니다.
목록 이해력으로 :
[i for i, j in enumerate(['foo', 'bar', 'baz']) if j == 'bar']
여기에 또 다른 작은 솔루션이 있습니다 itertools.count()
(이것은 열거와 거의 같은 접근법입니다).
from itertools import izip as zip, count # izip for maximum efficiency
[i for i, j in zip(count(), ['foo', 'bar', 'baz']) if j == 'bar']
이것은 다음을 사용하는 것보다 큰 목록에 더 효율적입니다 enumerate()
.
$ python -m timeit -s "from itertools import izip as zip, count" "[i for i, j in zip(count(), ['foo', 'bar', 'baz']*500) if j == 'bar']"
10000 loops, best of 3: 174 usec per loop
$ python -m timeit "[i for i, j in enumerate(['foo', 'bar', 'baz']*500) if j == 'bar']"
10000 loops, best of 3: 196 usec per loop
답변
모든 인덱스를 얻으려면
indexes = [i for i,x in enumerate(xs) if x == 'foo']
답변
index()
첫 번째 인덱스 값을 반환합니다 !
| 색인 (…)
| L.index (value, [start, [stop]])-> integer-첫 번째 인덱스 값을 반환
def all_indices(value, qlist):
indices = []
idx = -1
while True:
try:
idx = qlist.index(value, idx+1)
indices.append(idx)
except ValueError:
break
return indices
all_indices("foo", ["foo","bar","baz","foo"])
답변
요소가 목록에 없으면 문제가 발생합니다. 이 함수는 문제를 처리합니다.
# if element is found it returns index of element else returns None
def find_element_in_list(element, list_element):
try:
index_element = list_element.index(element)
return index_element
except ValueError:
return None
답변
a = ["foo","bar","baz",'bar','any','much']
indexes = [index for index in range(len(a)) if a[index] == 'bar']