'for'루프에서 인덱스에 액세스합니까?


3602

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까지 루프 인덱스에 어떻게 액세스합니까?


42
파이썬의 인덱스는 0부터 시작하므로 예제 목록의 인덱스는
1-5가 아닌 0-4입니다.

답변:


6108

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

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

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

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


61
Aaron이 아래에 지적한 것처럼 0-4 대신 1-5를 얻으려면 start = 1을 사용하십시오.
clozach

2
않는 enumerate또 다른 오버 헤드가 발생하지?
TheRealChx101

내 테스트 (Python 3.6.3)에 따르면 @ TheRealChx101의 차이는 무시할 만하 며 때로는 찬성 enumerate합니다.
Błotosmętek

804

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
" 카운트 받기 "예제 items가 비어 있을 때 작동 합니까?
Bergi

ajax를 사용하여 데이터를 변수 legData 에 값 이 2 인 두 값 형식의 배열로 장고 뷰에 데이터를 보내고 있습니다 [1406, 1409]. 를 사용하여 콘솔에 인쇄 print(legData)하면 출력은 [1406,1409] 입니다. 그러나 목록과 같은 개별 값을 구문 분석하려고 for idx, xLeg in enumerate(legData): print(idx, xLeg)하면 인덱스 0, 1, 2, 3, 4 에 대해 [, 1, 4, 0, 6 등과 같은 개별 정수의 출력을 얻습니다. 등 (예, 대괄호 및 쉼표는 데이터 자체의 일부 인 것처럼 출력됩니다 ). 여기서 무엇이 잘못 되었나요?
user12379095

@ user12379095 아마도 잘못된 유형 (문자열)의 데이터가 있으며 문자열 대신 실제 숫자 목록으로 변환해야합니다. 그것은 여기서 다소 주제가 아닙니다. 코멘트를 삭제하고 이것을 볼 때 더 이상 필요하지 않게 삭제되도록 플래그를 지정하십시오.
Aaron Hall

152

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

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

노트

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


11
문제는리스트 인덱스에 관한 것이었다. 그들이 0에서 시작하기 때문에 인덱스가 잘못되기 때문에 다른 숫자에서 시작하는 데 약간의 포인트가 있습니다 (예, OP도 질문에서 잘못 말했다). 그렇지 않으면,의 튜플 인 변수 호출 index, item단지 index당신이 언급 한 바와 같이 매우, 오해의 소지가된다. 그냥 사용하십시오 for index, item in enumerate(ints).
Antti Haapala

1
괄호 안에 색인을 (인덱스)로 묶는 것이
좋습니다

1
@AnttiHaapala 그 이유는 질문의 예상 출력이 인덱스 1 대신 0부터 시작하기 때문입니다.
pushkin

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

10
아마도 xrange3.0 이전 버전 이어야합니다 .
Ben Blank

43
대신 사용 열거
saulspatz

3
위의 Python 2.3의 경우 열거 형 내장 함수를 사용하십시오.
januarvs

열거가 항상 더 좋은 것은 아니며 응용 프로그램의 요구 사항에 따라 다릅니다. 현재 상황에서 객체 길이 간의 관계는 내 응용 프로그램에 의미가 있습니다. 열거 형을 사용하기 시작했지만 열거 할 객체를 선택하기 위해 논리를 작성하지 않아도되도록이 접근법으로 전환했습니다.
adg

1
@adg 피하는 것이 어떻게 enumerate논리를 저장 하지 않는지 알 수 없습니다 . 여전히 색인을 생성 할 객체를 선택해야합니다 i.
chepner

47

파이썬의 표준과 마찬가지로 이것을 수행하는 몇 가지 방법이 있습니다. 모든 예에서 다음을 가정합니다.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를 사용 합니다. 다른 예제보다 중첩 루프를 더 잘 처리합니다.


30

구식 방법 :

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)
>>> 

3
이것은 잘못된 것이 아니며 C / C ++ 및 기타에서 사용됩니다. 비 파이썬으로 간주되지만 파이썬에서도 사용할 수 있습니다. 소스로 분류하는 간단한 솔루션처럼 : +
Valor Naram

일부 파이썬 극단 주의자 들은 이것을하지 마십시오. 그러나 나는 단지 하나 이상의 가능한 방법이 있음을 나타 내기 위해서만 말했다
Valor Naram

21

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경우 승자가됩니다.

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


5
"가독성 카운트"작은 <1000 범위의 속도 차이는 중요하지 않습니다. 이미 작은 시간 메트릭에서 3 % 느립니다.

파이썬 3에 대한 답변을 업데이트하는 것은 어떻습니까?
Georgy

14

우선, 인덱스는 0부터 4까지입니다. 프로그래밍 언어는 0부터 카운트를 시작합니다. 잊지 마십시오. 또는 범위를 벗어난 색인 예외가 발생합니다. for 루프에서 필요한 것은 다음과 같이 0에서 4까지의 계수입니다.

for x in range(0, 5):

루프가 최대 값보다 한 번호 앞을 멈추기 때문에 0에서 5까지 썼음을 명심하십시오. :)

인덱스 값을 얻으려면

list[index]

13

다음은 for루프 에서 인덱스에 액세스 할 때 얻는 것입니다 .

for i in enumerate(items): print(i)

items = [8, 23, 45, 12, 78]

for i in enumerate(items):
    print("index/value", i)

결과:

# index/value (0, 8)
# index/value (1, 23)
# index/value (2, 45)
# index/value (3, 12)
# index/value (4, 78)

for i, val in enumerate(items): print(i, val)

items = [8, 23, 45, 12, 78]

for i, val in enumerate(items):
    print("index", i, "for value", val)

결과:

# index 0 for value 8
# index 1 for value 23
# index 2 for value 45
# index 3 for value 12
# index 4 for value 78

for i, val in enumerate(items): print(i)

items = [8, 23, 45, 12, 78]

for i, val in enumerate(items):
    print("index", i)

결과:

# index 0
# index 1
# index 2
# index 3
# index 4

12

이 토론에 따르면 : http://bytes.com/topic/python/answers/464012-objects-list-index

루프 카운터 반복

인덱스를 반복하는 현재 관용구는 내장 range함수를 사용합니다.

for i in range(len(sequence)):
    # work with index i

구식 관용구 나 새로운 zip내장 함수를 사용하여 요소와 색인을 모두 반복 할 수 있습니다 .

for i in range(len(sequence)):
    e = sequence[i]
    # work with index i and element e

또는

for i, e in zip(range(len(sequence)), sequence):
    # work with index i and element e

http://www.python.org/dev/peps/pep-0212/ 를 통해


22
생성기를 반복하는 데는 작동하지 않습니다. enumerate ()를 사용하십시오.
Tadeck

요즘에는 현재 관용구가 범위 호출이 아닌 열거됩니다.
TankorSmash

이전 답변과 동일합니다. stackoverflow.com/a/522576/6451573
Jean-François Fabre

11

이 코드로 할 수 있습니다 :

ints = [8, 23, 45, 12, 78]
index = 0

for value in (ints):
    index +=1
    print index, value

루프 끝에서 색인 값을 재설정해야하는 경우이 코드를 사용하십시오.

ints = [8, 23, 45, 12, 78]
index = 0

for value in (ints):
    index +=1
    print index, value
    if index >= len(ints)-1:
        index = 0

10

이 문제에 대한 최선의 해결책은 열거 형 파이썬 함수를 사용하는 것입니다.
열거튜플
제 값은 인덱스
초 값은 소자 그 인덱스 어레이

In [1]: ints = [8, 23, 45, 12, 78]

In [2]: for idx, val in enumerate(ints):
   ...:         print(idx, val)
   ...:     
(0, 8)
(1, 23)
(2, 45)
(3, 12)
(4, 78)

9

귀하의 질문에, "이 경우 1에서 5까지 루프 인덱스에 어떻게 액세스합니까?"라고 씁니다.

그러나 목록의 인덱스는 0부터 시작합니다. 따라서 실제로 원하는 것이 목록의 각 항목에 대한 인덱스 및 항목인지 또는 1부터 시작하는 숫자를 원하는지 여부를 알아야합니다. 다행히 파이썬에서는 두 가지 중 하나 또는 모두를 수행하는 것이 쉽습니다.

먼저 명확히하기 위해 enumerate함수는 목록의 각 항목에 대한 색인과 해당 항목을 반복적으로 반환합니다.

alist = [1, 2, 3, 4, 5]

for n, a in enumerate(alist):
    print("%d %d" % (n, a))

위의 출력은 다음과 같습니다.

0 1
1 2
2 3
3 4
4 5

인덱스는 0에서 시작합니다. 이러한 종류의 인덱싱은 Python 및 C를 포함한 최신 프로그래밍 언어에서 일반적입니다.

루프가 목록의 일부로 확장되도록하려면 목록의 일부에 표준 Python 구문을 사용할 수 있습니다. 예를 들어 목록의 두 번째 항목에서 마지막 항목까지는 반복하지 않으려면 다음을 사용할 수 있습니다.

for n, a in enumerate(alist[1:-1]):
    print("%d %d" % (n, a))

다시 한번, 출력 인덱스는 0부터 실행됩니다.

0 2
1 3
2 4

그것은 우리를위한 start=n스위치로 우리를 가져옵니다 enumerate(). 이것은 단순히 인덱스를 상쇄하므로 루프 내부의 인덱스에 숫자를 간단히 추가 할 수 있습니다.

for n, a in enumerate(alist, start=1):
    print("%d %d" % (n, a))

출력이있는

1 1
2 2
3 3
4 4
5 5

9

반복한다면 내가 nums = [1, 2, 3, 4, 5]할 것

for i, num in enumerate(nums, start=1):
    print(i, num)

또는 길이를 l = len(nums)

for i in range(l):
    print(i+1, nums[i])

7

목록에 중복 값이없는 경우 :

for i in ints:
    indx = ints.index(i)
    print(i, indx)

1
첫 번째 옵션은 시퀀스의 각 항목이 고유 한 경우에만 올바르게 작동하므로 사용하지 않아야합니다.
Stam Kaly

2
첫 번째 옵션은 끔찍한 아이디어 인 O (n²)입니다. 목록이 1000 개의 요소 길이 인 경우 문자를 사용하는 것보다 문자 그대로 1000 배 더 오래 걸립니다 enumerate. 이 답변을 삭제해야합니다.
보리스

5

당신은 또한 이것을 시도 할 수 있습니다 :

data = ['itemA.ABC', 'itemB.defg', 'itemC.drug', 'itemD.ashok']
x = []
for (i, item) in enumerate(data):
      a = (i, str(item).split('.'))
      x.append(a)
for index, value in x:
     print(index, value)

출력은

0 ['itemA', 'ABC']
1 ['itemB', 'defg']
2 ['itemC', 'drug']
3 ['itemD', 'ashok']

3

당신은 index방법을 사용할 수 있습니다

ints = [8, 23, 45, 12, 78]
inds = [ints.index(i) for i in ints]

편집 에 중복 된 경우이 방법이 작동하지 않는다는 의견에서 강조 표시되면 ints아래 방법은 다음의 값에 대해 작동해야합니다 ints.

ints = [8, 8, 8, 23, 45, 12, 78]
inds = [tup[0] for tup in enumerate(ints)]

또는 대안으로

ints = [8, 8, 8, 23, 45, 12, 78]
inds = [tup for tup in enumerate(ints)]

인덱스와 값을 모두 ints튜플 목록으로 가져 오려면

enumerate이 질문에 대한 선택된 답변 의 방법을 사용 하지만 목록 이해력이있어 코드가 적을수록 더 빠릅니다.


2

While 루프를 사용한 간단한 답변 :

arr = [8, 23, 45, 12, 78]
i = 0
while i<len(arr):
    print("Item ",i+1," = ",arr[i])
    i +=1

산출:

여기에 이미지 설명을 입력하십시오


1

for루프를 사용하여 목록 이해에서 (색인, 값) 튜플을 인쇄하려면 다음을 수행하십시오.

ints = [8, 23, 45, 12, 78]
print [(i,ints[i]) for i in range(len(ints))]

산출:

[(0, 8), (1, 23), (2, 45), (3, 12), (4, 78)]

1

이것은 목적을 충분히 제공합니다.

list1 = [10, 'sumit', 43.21, 'kumar', '43', 'test', 3]
for x in list1:
    print('index:', list1.index(x), 'value:', x)

4
목록에 반복되는 요소가 있으면 index()첫 번째 항목 을 검색하고 각 요소를 찾는 데 필요한 xO ( n ^ 2 ) 시간 은 언급하지 않고이 오류가 발생 합니다.
Peter Szoldan

목록의 중복 요소에는 작동하지 않는다는 데 완전히 동의했습니다. 결국 나는 파이썬도 배우고 있습니다.
Kumar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.