[python] ‘for’루프에서 인덱스에 액세스합니까?

for다음과 같은 루프 에서 색인에 어떻게 액세스 합니까?

ints = [8, 23, 45, 12, 78]
for i in ints:
    print('item #{} = {}'.format(???, i))

이 출력을 얻고 싶습니다 :

item #1 = 8
item #2 = 23
item #3 = 45
item #4 = 12
item #5 = 78

루프를 사용하여 for루프를 반복 할 때이 경우 1에서 5까지 루프 인덱스에 어떻게 액세스합니까?



답변

색인 변수 (예 : C 또는 PHP와 같은 언어에서 일반적으로 사용)와 같은 추가 상태 변수를 사용하는 것은 비피 토닉으로 간주됩니다.

더 나은 옵션은 enumerate()Python 2와 3에서 모두 사용할 수 있는 내장 함수를 사용하는 것입니다 .

for idx, val in enumerate(ints):
    print(idx, val)

자세한 내용은 PEP 279 를 확인하십시오 .


답변

for 루프를 사용하면이 경우 1에서 5까지 루프 인덱스에 어떻게 액세스합니까?

enumerate반복 할 때 요소가있는 색인을 얻는 데 사용하십시오 .

for index, item in enumerate(items):
    print(index, item)

그리고 파이썬의 인덱스는 0에서 시작하므로 위와 같이 0에서 4를 얻습니다. 1에서 5까지의 개수를 원하면 다음을 수행하십시오.

for count, item in enumerate(items, start=1):
    print(count, item)

단일 제어 흐름

당신이 요구하는 것은 다음과 같은 Pythonic과 같습니다.이 언어는 대부분의 저급 언어 프로그래머가 사용할 알고리즘입니다.

index = 0            # Python's indexing starts at zero
for item in items:   # Python's for loops are a "for each" loop 
    print(index, item)
    index += 1

또는 for-each 루프가없는 언어로 :

index = 0
while index < len(items):
    print(index, items[index])
    index += 1

또는 때로는 파이썬에서 더 일반적으로 (그러나 관용적으로) 발견됩니다.

for index in range(len(items)):
    print(index, items[index])

열거 함수 사용

파이썬의 enumerate함수 는 인덱스에 대한 설명을 숨기고 이터 러블을 다른 iterable ( enumerate객체) 로 캡슐화하여 인덱스 의 두 항목 튜플과 원래 iterable이 제공 할 항목을 생성하는 이터 러블을 캡슐화함으로써 시각적 혼란을 줄입니다. 이것은 다음과 같습니다

for index, item in enumerate(items, start=0):   # default is zero
    print(index, item)

이 코드 샘플은 파이썬의 관용적 코드와 그렇지 않은 코드의 차이점에 대한 표준 예입니다. 관용적 코드는 정교하지만 (복잡하지는 않지만) 파이썬으로, 의도 된 방식으로 작성되었습니다. 관용어는 언어 설계자에 의해 예상됩니다. 즉, 일반적으로이 코드는 더 읽기 쉽고 효율적입니다.

카운트하기

인덱스를 필요로하지 않더라도 반복 횟수 (때로는 원할 경우)가 필요 1하고 최종 숫자는 카운트가됩니다.

for count, item in enumerate(items, start=1):   # default is zero
    print(item)

print('there were {0} items printed'.format(count))

1에서 5까지 원한다고 말했을 때 (인수가 아닌) 요청하려는 것보다 더 많은 것으로 보입니다.


세분화-단계별 설명

이 예제들을 정리하기 위해 인덱스로 반복하고 싶은 아이템리스트가 있다고 가정 해 봅시다.

items = ['a', 'b', 'c', 'd', 'e']

이제이 iterable을 전달하여 열거 객체를 생성합니다.

enumerate_object = enumerate(items) # the enumerate object

이 iterable에서 첫 번째 항목을 가져와 next함수 와 함께 루프에 넣을 수 있습니다.

iteration = next(enumerate_object) # first iteration from enumerate
print(iteration)

그리고 우리 0는 첫 번째 인덱스와 'a'첫 번째 항목 의 튜플을 얻습니다 .

(0, 'a')

이 두 튜플에서 요소를 추출하기 위해 ” 시퀀스 언 패킹 ” 이라고하는 것을 사용할 수 있습니다 .

index, item = iteration
#   0,  'a' = (0, 'a') # essentially this.

검사 할 때 index첫 번째 인덱스 0을 item가리키고 첫 번째 항목을 나타냅니다 'a'.

>>> print(index)
0
>>> print(item)
a

결론

  • 파이썬 인덱스는 0에서 시작
  • 반복 할 때 iterable에서 이러한 인덱스를 얻으려면 enumerate 함수를 사용하십시오.
  • 튜플 압축 풀기와 함께 관용적 방식으로 열거를 사용하면 더 읽기 쉽고 유지 관리가 쉬운 코드가 생성됩니다.

이렇게하십시오 :

for index, item in enumerate(items, start=0):   # Python indexes start at zero
    print(index, item)


답변

다음 1이외의 방법 으로 시작하는 것은 매우 간단합니다 0.

for index, item in enumerate(iterable, start=1):
   print index, item

노트

중요한 힌트 indextuple (idx, item)여기에 있기 때문에 조금 오해의 소지 가 있습니다 . 잘가요


답변

for i in range(len(ints)):
   print i, ints[i]


답변

파이썬의 표준과 마찬가지로 이것을 수행하는 몇 가지 방법이 있습니다. 모든 예에서 다음을 가정합니다.lst = [1, 2, 3, 4, 5]

1. 열거 사용 ( 가장 관용적 인 것으로 간주 됨 )

for index, element in enumerate(lst):
    # do the things that need doing here

무한 재귀로 들어갈 가능성이 없어 졌기 때문에 이것은 또한 내 의견으로는 가장 안전한 옵션입니다. 항목과 해당 색인은 변수로 유지되며 항목에 액세스하기 위해 추가 코드를 작성할 필요가 없습니다.

2. 색인을 보유 할 변수 작성 (을 사용하여for )

for index in range(len(lst)):   # or xrange
    # you will have to write extra code to get the element

3. 색인을 보유 할 변수 작성 (을 사용하여while )

index = 0
while index < len(lst):
    # you will have to write extra code to get the element
    index += 1  # escape infinite recursion

4. 항상 다른 방법이 있습니다

앞에서 설명한 것처럼 여기에 설명되지 않은 다른 방법이 있으며 다른 상황에서도 더 많이 적용될 수 있습니다. 들어itertools.chain with를 사용 합니다. 다른 예제보다 중첩 루프를 더 잘 처리합니다.


답변

구식 방법 :

for ix in range(len(ints)):
    print ints[ix]

목록 이해 :

[ (ix, ints[ix]) for ix in range(len(ints))]

>>> ints
[1, 2, 3, 4, 5]
>>> for ix in range(len(ints)): print ints[ix]
...
1
2
3
4
5
>>> [ (ix, ints[ix]) for ix in range(len(ints))]
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]
>>> lc = [ (ix, ints[ix]) for ix in range(len(ints))]
>>> for tup in lc:
...     print tup
...
(0, 1)
(1, 2)
(2, 3)
(3, 4)
(4, 5)
>>> 


답변

Python 2.7 에서 루프 내의 목록 색인에 액세스하는 가장 빠른 방법 은 작은 목록에 범위 방법 을 사용하고 중간 및 큰 크기 목록에 대해 방법열거하는 것 입니다.

아래 코드 샘플에서 목록 및 액세스 인덱스 값과 해당 성능 메트릭 (여러분에게 유용 할 것으로 예상 됨) 을 반복하는 데 사용할 수있는 다양한 접근 방법 을 참조하십시오 .

from timeit import timeit

# Using range
def range_loop(iterable):
    for i in range(len(iterable)):
        1 + iterable[i]

# Using xrange
def xrange_loop(iterable):
    for i in xrange(len(iterable)):
        1 + iterable[i]

# Using enumerate
def enumerate_loop(iterable):
    for i, val in enumerate(iterable):
        1 + val

# Manual indexing
def manual_indexing_loop(iterable):
    index = 0
    for item in iterable:
        1 + item
        index += 1

아래의 각 방법에 대한 성능 지표를 참조하십시오.

from timeit import timeit

def measure(l, number=10000):
print "Measure speed for list with %d items" % len(l)
print "xrange: ", timeit(lambda :xrange_loop(l), number=number)
print "range: ", timeit(lambda :range_loop(l), number=number)
print "enumerate: ", timeit(lambda :enumerate_loop(l), number=number)
print "manual_indexing: ", timeit(lambda :manual_indexing_loop(l), number=number)

measure(range(1000))
# Measure speed for list with 1000 items
# xrange:  0.758321046829
# range:  0.701184988022
# enumerate:  0.724966049194
# manual_indexing:  0.894635915756

measure(range(10000))
# Measure speed for list with 100000 items
# xrange:  81.4756360054
# range:  75.0172479153
# enumerate:  74.687623024
# manual_indexing:  91.6308541298

measure(range(10000000), number=100)
# Measure speed for list with 10000000 items
# xrange:  82.267786026
# range:  84.0493988991
# enumerate:  78.0344707966
# manual_indexing:  95.0491430759

결과적으로 range방법을 사용 하는 것이 1000 개의 항목을 나열하는 것 중 가장 빠릅니다. 크기가 10 000보다 큰 목록의 enumerate경우 승자가됩니다.

아래에 유용한 링크를 추가하십시오.