파이썬에서 `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