enumerate ()는 무엇을 의미합니까?


답변:


513

enumerate()함수 는 iterable에 카운터를 추가합니다.

따라서의 각 요소에 cursor대해 튜플은 다음과 같이 생성됩니다 (counter, element). for루프 귀속에 해당 row_number하고 row, 각각.

데모:

>>> elements = ('foo', 'bar', 'baz')
>>> for elem in elements:
...     print elem
... 
foo
bar
baz
>>> for count, elem in enumerate(elements):
...     print count, elem
... 
0 foo
1 bar
2 baz

기본적으로 enumerate()계산을 시작 0하지만 두 번째 정수 인수를 지정하면 대신 해당 숫자에서 시작합니다.

>>> for count, elem in enumerate(elements, 42):
...     print count, elem
... 
42 foo
43 bar
44 baz

enumerate()파이썬 으로 재 구현해야한다면 다음 두 가지 방법이 있습니다. 하나 itertools.count()는 계산을 수행하고 다른 하나는 수동으로 생성기 함수 에서 계산 합니다 .

from itertools import count

def enumerate(it, start=0):
    # return an iterator that adds a counter to each element of it
    return zip(count(start), it)

def enumerate(it, start=0):
    count = start
    for elem in it:
        yield (count, elem)
        count += 1

C에서실제 구현 은 후자에 더 가깝습니다. 일반적인 for i, ...압축 풀기 사례에 단일 튜플 객체를 재사용 하고 카운터가 너무 커질 때까지 카운터에 대해 표준 C 정수 값을 사용하여 Python 정수 객체 ( 끝이 없습니다).


92

반복 가능한 객체를 반환하는 내장 함수입니다. 설명서를 참조하십시오 .

간단히 말해, iterable (목록과 같은)의 요소와 튜플에 결합 된 색인 번호를 반복합니다.

for item in enumerate(["a", "b", "c"]):
    print item

인쇄물

(0, "a")
(1, "b")
(2, "c")

시퀀스 (또는 다른 반복 가능한 것)를 반복하고 인덱스 카운터를 사용하려는 경우 유용합니다. 카운터가 다른 값 (일반적으로 1)에서 시작되도록하려면이를 두 번째 인수로 지정할 수 있습니다 enumerate.


1
두 번째 변수를 추가 item하면 괄호를 제거 할 수 있습니다 : D
Abdelouahab

2
Pedantic : 생성자가 아닌 반복자를 반환하는 함수입니다. 제너레이터는 특정 클래스의 사용자 정의 함수입니다 ( 암시 적으로 yield/ yield from또는 제너레이터 표현식 사용 yield). enumerate발전기가 아닙니다. 모든 오리 타이핑 관련 목적에는 차이가 없지만 명시 적 유형 검사와 파이썬 언어 문서는 "제너레이터"라는 용어를 한 가지 목적으로 만 사용하며, 여기에서는 다루지 않습니다 enumerate.
ShadowRanger

22

Brett Slatkin 의 책 ( Effective Python )을 읽고 있으며 목록을 반복하고 목록의 현재 항목 색인을 아는 다른 방법을 보여 주지만 사용 enumerate하지 않고 대신 사용하는 것이 좋습니다. 열거 형의 의미에 대해 질문했지만, 다음을 이해했을 때 enumerate현재 항목의 색인을 더 쉽고 알기 쉽게 알고 목록을 반복 하는 방법 을 이해했습니다 .

list_of_letters = ['a', 'b', 'c']
for i in range(len(list_of_letters)):
    letter = list_of_letters[i]
    print (i, letter)

출력은 다음과 같습니다.

0 a
1 b
2 c

나는 또한 enumerate함수 에 대해 읽기 전에 더 어리석은 일을 했었습니다 .

i = 0
for n in list_of_letters:
    print (i, n)
    i += 1

동일한 출력을 생성합니다.

그러나 enumerate나는 단지 다음 과 같이 작성해야합니다.

list_of_letters = ['a', 'b', 'c']
for i, letter in enumerate(list_of_letters):
    print (i, letter)

20

다른 사용자가 언급했듯이 enumerateiterable의 각 항목 옆에 증분 색인을 추가하는 생성기가 있습니다.

당신이 목록의 말씀이있는 경우 그래서 l = ["test_1", "test_2", "test_3"]는이 list(enumerate(l))당신에게 이런 식으로 뭔가를 줄 것이다 [(0, 'test_1'), (1, 'test_2'), (2, 'test_3')].

이게 언제 유용한가요? 가능한 유스 케이스는 항목을 반복하고 목록에서 색인 만 알고 값은 알지 못하는 특정 항목을 건너 뛰는 경우입니다 (값은 알 수 없기 때문에).

for index, value in enumerate(joint_values):
   if index == 3:
       continue

   # Do something with the other `value`

따라서 정기적 인 for 루프를 수행 할 수 range있지만 색인을 생성해야하는 항목 (예 :)에 액세스 할 수 있으므로 코드가 더 잘 읽 힙니다 joint_values[i].

다른 사용자가의 enumerate사용 구현에 대해 언급했지만 zip, 사용하지 않는 더 순수한 (그러나 약간 더 복잡한) 방법 itertools은 다음과 같습니다.

def enumerate(l, start=0):
    return zip(range(start, len(l) + start), l)

예:

l = ["test_1", "test_2", "test_3"]
enumerate(l)
enumerate(l, 10)

산출:

[(0, 'test_1'), (1, 'test_2'), (2, 'test_3')]

[(10, 'test_1'), (11, 'test_2'), (12, 'test_3')]

주석에서 언급했듯이 범위가있는이 접근법은 원래 enumerate함수 와 마찬가지로 임의의 반복 가능 항목에서 작동하지 않습니다.


다른 답변을 언급하는 이유는 itertools당신의 것입니다 range방법은 컨테이너와 함께 작동합니다. enumerate임의의 이터 러블과 함께 작동합니다. 파일을 반복하고 for lineno, line in enumerate(myfile):작동하지만 range(len(myfile))EOF에 도달 할 때까지 길이를 알 수 없으므로 수행 할 수 없습니다 .
ShadowRanger

12

열거 함수는 다음과 같이 작동합니다.

doc = """I like movie. But I don't like the cast. The story is very nice"""
doc1 = doc.split('.')
for i in enumerate(doc1):
     print(i)

출력은

(0, 'I like movie')
(1, " But I don't like the cast")
(2, ' The story is very nice')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.