Python 목록 반복을위한 시작 색인


88

Python에서 목록을 반복 할 때 시작 색인을 설정하는 가장 좋은 방법은 무엇입니까? 예를 들어, 요일 목록 (일요일, 월요일, 화요일 ... 토요일)이 있지만 월요일부터 시작하는 목록을 반복하고 싶습니다. 이를 수행하는 가장 좋은 방법은 무엇입니까?


1
토요일까지 반복 하시겠습니까, 아니면 마지막으로 일요일에 인쇄하고 싶습니까?
juanchopanza

토요일까지 반복하고 싶었습니다. 나는 지금까지 파이썬 목록에서 슬라이싱을 사용할 수 있다는 것을 깨닫지 못했습니다.
Vincent Catalano

목록뿐만 아니라 생성기 / 이터 러블도 다루는 솔루션이 있습니까? 아니면 정말 큰 목록?
Charlie Parker

답변:


174

슬라이싱 을 사용할 수 있습니다 .

for item in some_list[2:]:
    # do stuff

이것은 세 번째 요소에서 시작하여 끝까지 반복됩니다.


2
이것이 바로 제가 찾던 것입니다. 감사!
Vincent Catalano

30
이것은 큰 목록에 비효율적이지 않습니까? 이 슬라이스 작업은 참조되는 목록 요소를 새 목록으로 복사해야한다고 생각합니다.
UndeadKernel 2014 년

4
예, 큰 목록에는 비효율적입니다. 복사하지 않는 솔루션은 아래의 gnibblers 답변을 참조하십시오.
Björn Pollex 2014 년

생성기 / 반복을 사용하여 반복하는 경우 어떻게해야합니까?
Charlie Parker

2
isliceJohn La Rooy의 답변에서 제안한대로을 사용해야합니다 .
Björn Pollex

50

islice 목록의 일부를 복사 할 필요가 없다는 장점이 있습니다.

from itertools import islice
for day in islice(days, 1, None):
    ...

13

인덱스 카운터를 사용하여 항상 기존 C 스타일 루핑을 반복 할 수 있습니다.

for i in range(len(l)-1):
    print l[i+1]

항상 "모든 요소에 대한 루프"스타일을 따르는 것이 낫습니다. 왜냐하면 그것이 정상적인 일이기 때문입니다. 그러나 그것이 방해가된다면, 항상 전통적인 스타일도 지원된다는 것을 기억하십시오.


9

stdlib는 아들을 연결합니다!

deque.rotate():

#!/usr/local/bin/python2.7

from collections import deque

a = deque('Monday Tuesday Wednesday Thursday Friday Saturday Sunday'.split(' '))
a.rotate(3)
deque(['Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday'])

4

당신이 원하는 모든 것이 Monday이후부터 인쇄하는 것이라면 , 당신은 목록에서 "Monday"가있는 위치를 찾기 위해 listindex방법을 사용할 수 있고 다른 포스트에서 설명 된대로 거기에서 반복 할 수 있습니다. 를 사용 list.index하면 잠재적 인 오류 원인 인 "월요일"에 대한 색인을 하드 코딩 할 수 있습니다.

days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
for d in days[days.index('Monday'):] :
   print d

정말 좋은 솔루션!
aderchox

3

여기에 입력 시퀀스의 뒤틀린 복사본을 만들 필요가없는 회전 생성기가 있습니다. 입력 시퀀스가 ​​7 개 항목보다 훨씬 큰 경우 유용 할 수 있습니다.

>>> def rotated_sequence(seq, start_index):
...     n = len(seq)
...     for i in xrange(n):
...         yield seq[(i + start_index) % n]
...
>>> s = 'su m tu w th f sa'.split()
>>> list(rotated_sequence(s, s.index('m')))
['m', 'tu', 'w', 'th', 'f', 'sa', 'su']
>>>

예-무한 반복 시퀀스를 생성하도록 확장하기 쉽습니다.
2011 년

@JohnMachin에게 감사하는 것을 도울 수 없습니다 : 264 년 동안 죽은 누군가를위한 훌륭한 일
jjon

1

사람들이 목록 분할 (새 목록에 복사하기 때문에 느림)을 사용하거나 라이브러리 함수를 가져 오거나이를 위해 배열을 회전하려는 이유는 무엇입니까?

range(start, stop, step)(여기서 및는 선택적 인수) start와 함께 일반 for 루프를 사용합니다 step.

예를 들어 인덱스 1에서 시작하는 배열을 반복합니다.

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

0

월요일 이전에 항목을 잘라내는 대신 월요일부터 시작하도록 목록을 "둘러싸고"효과적으로 회전하려는 경우 :

dayNames = [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 
            'Friday', 'Saturday',  ]

startDayName = 'Monday'

startIndex = dayNames.index( startDayName )
print ( startIndex )

rotatedDayNames = dayNames[ startIndex: ] + dayNames [ :startIndex ]

for x in rotatedDayNames:
    print ( x )
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.