파이썬에서 `Foreach`루프의 인덱스에 액세스하는 방법

Aliaksei Yursha 2022년4월14일
파이썬에서 `Foreach`루프의 인덱스에 액세스하는 방법

파이썬에서 아이템 컬렉션을 반복 할 때 종종 각 아이템과 관련된 서수를 가져야합니다.
이러한 숫자는 보통 ‘인덱스’라고합니다.

foreach- 루프를 수행하면서 인덱스에 액세스하는 pythonic 방법은 내장 함수 [enumerate()](https://docs.python.org/3/library/functions.html#enumerate 를 사용하는 것입니다 ).

enumerate()는 반복 가능한 컬렉션의 각 항목에 인덱스를 추가합니다.
그런 다음 list()내장 함수를 사용하여 튜플 목록을 가져올 수 있습니다.

>>> names = ['Bob', 'Alice', 'John', 'Cindy']
>>> list(enumerate(names))
[(0, 'Bob'), (1, 'Alice'), (2, 'John'), (3, 'Cindy')]

파이썬 인덱싱은 0 부터 시작합니다.

그러나 보고서 데이터를 인쇄 할 때와 같이 1 에서 색인을 시작하려면 추가 start 인수를 enumerate 에 전달하면됩니다.

>>> names = ['Bob', 'Alice', 'John', 'Cindy']
>>> list(enumerate(names), start=1)
[(1, 'Bob'), (2, 'Alice'), (3, 'John'), (4, 'Cindy')]

위의 방법은 다른 데이터 소스의 데이터를 인쇄하지만 모든 데이터 항목에서 일관된 인덱스를 원할 경우에도 유용합니다.

>>> data_source1 = ['Bob', 'Alice', 'John', 'Cindy']
>>> data_source2 = ['Sarah', 'Jeff', 'Emily', 'Adam']
>>> list(enumerate(data_source1, start=1))
[(1, 'Bob'), (2, 'Alice'), (3, 'John'), (4, 'Cindy')]
>>> list(enumerate(data_source2, start=len(data_source1) + 1))
[(5, 'Sarah'), (6, 'Jeff'), (7, 'Emily'), (8, 'Adam')]

Enumerate 객체를 목록으로 변환 할 필요는 없습니다.
iterable 자체이므로 직접 반복 할 수 있습니다.

>>> names = ['Bob', 'Alice', 'John', 'Cindy']
>>> for idx, name in enumerate(names):
...   print(name)
...
Bob
Alice
John
Cindy

아이템 컬렉션을 반복하면서 인덱스를 유지하는 다른 방법이있을 수 있습니다.
그러나 enumerate()를 사용하는 것은 정식으로 간주되며 선호됩니다.

다른 옵션은 별도의 색인 변수를 사용하고 수동으로 초기화하고
반복 할 때마다 수동으로 증가시킵니다.
그러나 이러한 접근 방식은 바퀴의 재발 명으로 간주되어 눈살을 찌푸 렸습니다.

enumerate() 함수가 소개 된 PEP 279의 인용문입니다.

이 PEP 에는 새로운 내장 함수 enumerate()가 도입되어 일반적으로 사용되는 루핑 관용구를 단순화합니다. iteritems()가 사전에 제공하는 것과 동일한 장점을 가진 반복 가능한 컬렉션을 제공합니다. ** 작고 읽기 쉽고 안정적인 인덱스 표기법 **.

코드에서 ‘열거’를 사용하면 성능에 영향을 줄 수 있는지 묻습니다.
글쎄, 당신은 모든 측정을 자유롭게 할 수 있지만, 열거는 for-each 루프에서 iterable 의 인덱스에 액세스하는 관용적 방법이라는 것을 명심하십시오.
파이썬 관리자가 관용적 코드를 권장하며 모든 것을 만들 것입니다.
효율적으로 실행하십시오.

그리고 아래에서 가장 궁금한 사람들은 위의 PEP 에서 enumerate()함수를 구현할 수 있다는 것입니다.

def enumerate(collection):
    "Generates an indexed series:  (0,coll[0]), (1,coll[1]) ..."
    i = 0
    it = iter(collection)
    while 1:
        yield (i, it.next())
        i += 1

관련 문장 - Python Loop