[python] 목록에서 항목의 색인 찾기

목록 ["foo", "bar", "baz"]과 목록 에 항목이 주어지면 파이썬에서 "bar"색인 ( 1)을 어떻게 얻 습니까?



답변

>>> ["foo", "bar", "baz"].index("bar")
1

참조 : 데이터 구조> 목록에 대한 추가 정보

주의 사항

참고이 아마도 질문에 대답 할 수있는 가장 깨끗한 방법입니다 동안 것을 요청하면서 , index의 다소 약한 구성 요소 listAPI, 그리고 내가 분노를 마지막으로 사용한 시간을 기억할 수 없습니다. 이 답변이 많이 언급 되었기 때문에 더 완벽하게 작성해야한다는 의견에서 나에게 지적되었습니다. list.index다음과 같은 몇 가지주의 사항이 있습니다. 처음에는 문서를 살펴볼 가치가 있습니다.

list.index(x[, start[, end]])

값이 x 인 첫 번째 항목의 목록에서 0부터 시작하는 인덱스를 반환합니다 . ValueError해당 항목이 없으면 a를 발생시킵니다.

선택적 인수 startend슬라이스 표기법에서 와 같이 해석되며 검색을 목록의 특정 하위 시퀀스로 제한하는 데 사용됩니다. 반환 된 인덱스는 시작 인수가 아닌 전체 시퀀스의 시작을 기준으로 계산됩니다.

리스트 길이의 선형 시간 복잡성

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

항목이 목록에 없을 수 있으면

  1. item in my_list(깨끗하고 읽기 쉬운 접근 방식)으로 먼저 확인 하거나
  2. 잡는 블록으로 index통화를 감싸십시오 (적어도 검색 할 목록이 길고 항목이있는 경우 더 빠름).try/exceptValueError

답변

파이썬을 배우는 데 실제로 도움이되는 한 가지는 대화 형 도움말 함수를 사용하는 것입니다.

>>> 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']