for row_number, row in enumerate(cursor):
파이썬에서 무엇을 합니까?
enumerate
이 맥락에서 무엇을 의미합니까?
for row_number, row in enumerate(cursor):
파이썬에서 무엇을 합니까?
enumerate
이 맥락에서 무엇을 의미합니까?
답변:
이 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 정수 객체 ( 끝이 없습니다).
반복 가능한 객체를 반환하는 내장 함수입니다. 설명서를 참조하십시오 .
간단히 말해, iterable (목록과 같은)의 요소와 튜플에 결합 된 색인 번호를 반복합니다.
for item in enumerate(["a", "b", "c"]):
print item
인쇄물
(0, "a")
(1, "b")
(2, "c")
시퀀스 (또는 다른 반복 가능한 것)를 반복하고 인덱스 카운터를 사용하려는 경우 유용합니다. 카운터가 다른 값 (일반적으로 1)에서 시작되도록하려면이를 두 번째 인수로 지정할 수 있습니다 enumerate
.
item
하면 괄호를 제거 할 수 있습니다 : D
yield
/ yield from
또는 제너레이터 표현식 사용 yield
). enumerate
발전기가 아닙니다. 모든 오리 타이핑 관련 목적에는 차이가 없지만 명시 적 유형 검사와 파이썬 언어 문서는 "제너레이터"라는 용어를 한 가지 목적으로 만 사용하며, 여기에서는 다루지 않습니다 enumerate
.
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)
다른 사용자가 언급했듯이 enumerate
iterable의 각 항목 옆에 증분 색인을 추가하는 생성기가 있습니다.
당신이 목록의 말씀이있는 경우 그래서 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에 도달 할 때까지 길이를 알 수 없으므로 수행 할 수 없습니다 .
열거 함수는 다음과 같이 작동합니다.
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')