파이썬에서 인덱스를 사용하여 뒤로 루프?


286

100에서 0으로 반복하려고합니다. Python에서 어떻게합니까?

for i in range (100,0) 작동하지 않습니다.


9
BTW, 아마도 99에서 0으로, 거의 100에서 0으로 반복하고 싶을 것입니다. 이것은 답변에 영향을 미칩니다.
Acumenus

1
@Acumenus 바로 여기에 도달했을 때 내가 찾은 것입니다. 그리고 레코드에 대한 해결책은 간단하게 작성하는 것입니다 : range(100)[::-1](이 자동으로 변환됩니다 range(9, -1, -1)) - 파이썬 3.7에서 테스트
하산

답변:


399

보십시오 range(100,-1,-1), 사용에 증가되는 제 3 인수는 (문서화 된 여기 ).

( "범위"옵션, 시작, 중지, 단계는 여기 에 문서화되어 있습니다 )


3
또한 이것을 사용하여 컬렉션에서 항목을 삭제해야하므로 인덱스를 원했습니다.
Joan Venge

2
두 번째 인수는 최종 값보다 하나 작습니다. 따라서 -1을 입력하면 범위는 0에서 정지하고 -5를 입력하면 범위는 -4에서 정지합니다 (-1 증가)
mulllhausen

200

제 생각에는 이것이 가장 읽기 쉬운 것입니다.

for i in reversed(xrange(101)):
    print i,

14
이것은 실제로 메모리에 모든 숫자를 할당하지 않기 때문에 허용되는 답변보다 낫습니다 (Python 3에서는 허용되는 답변 중 하나도 그렇지 않음). 무슨 일이 일어나고 있는지 더 분명합니다.
Blixt

5
반전이 ... 뒤로 이동합니다 xrange를 알 수있는 방법이 없기 때문에 2.6 전에 파이썬은, 모든 숫자를 할당 않습니다 (파이썬 2.6 이후가) (__ __reversed 호출합니다.)
로버트 Siemer에게

나는 선호 reversed(xrange(len(list)))한다 xrange(len(list)-1:-1:-1); 후자는 너무 많은 것으로 이상하게 보입니다 -1.
musiphil

1
파이썬 3에서는 xrange ()를 더 이상 사용할 수 없습니다
Chris Graf

1
Python 3에서는 2.7에서 range와 동일한 방식으로 작동합니다 xrange. @hacksoi는 사용 사례에 따라 다르지만 큰 버퍼에서 거꾸로 반복한다고 가정하고 10MB라고 가정하고 앞뒤로 색인을 만드는 데 몇 초가 걸리고 50MB 이상의 메모리를 사용한다고 가정 해 봅시다. 리버스 된 생성기를 사용하는 데는 밀리 초가 걸리며 몇 바이트의 메모리 만 사용합니다.
Blixt

34
for i in range(100, -1, -1)

약간 더 길고 느린 해결책 :

for i in reversed(range(101))

for i in range(101)[::-1]

16

일반적으로 파이썬에서는 음수 인덱스를 사용하여 뒤에서 시작할 수 있습니다.

numbers = [10, 20, 30, 40, 50]
for i in xrange(len(numbers)):
    print numbers[-i - 1]

결과:

50
40
30
20
10

8

코드가 작동하지 않는 이유

당신은 코드 for i in range (100, 0)제외하고 는 괜찮습니다.

세 번째 매개 변수 ( step)는 기본적으로 +1입니다. 따라서 -1뒤로 단계 로 이동 하려면 range ()에 세 번째 매개 변수를 지정해야 합니다.

for i in range(100, -1, -1):
    print(i)

참고 : 여기에는 출력에 100 & 0이 포함됩니다.

여러 가지 방법이 있습니다.

더 좋은 방법

파이썬 방식의 경우 PEP 0322를 확인하십시오 .

이것은 100에서 0까지 인쇄하는 Python3 pythonic 예제입니다 (100 및 0 포함).

for i in reversed(range(101)):
    print(i)

1
예, PEP-322는 반복을 되돌릴 수있는 명확하고 오류가 발생하기 쉬운 방법을 제공합니다.
Allen Shen

1
이거 좋다 reversedPEP-322에서 구현하는 방법에 대한 권장 사항 은 오해의 소지가 있으므로 iterable reversed을 호출 __reversed__하고 결과를 반환 한다는 점에 유의해야하며 range객체의 경우 게으른 평가 range_object반복기입니다. 한마디로 :이 방법을 사용하는 것은 여전히 ​​게으른 평가입니다.
Ruzihm

5

다른 해결책 :

z = 10
for x in range (z):
   y = z-x
   print y

결과:

10
9
8
7
6
5
4
3
2
1

팁 :이 방법을 사용하여 목록의 색인을 다시 계산하는 경우 목록 색인이 0에서 시작하므로 'y'값에서 -1을 원합니다.


3

문제를 해결하는 간단한 대답은 다음과 같습니다.

for i in range(100):
    k = 100 - i
    print(k)


1

짧고 달다. 이것은 codeAcademy 과정을 수행 할 때 내 솔루션이었습니다. 문자열을 rev 순서로 인쇄합니다.

def reverse(text):
    string = ""
    for i in range(len(text)-1,-1,-1):
        string += text[i]
    return string    

1

당신은 항상 증가 범위를하고 귀하의 경우 변수에서 뺄 수있는 100 - ii in range( 0, 101 ).

for i in range( 0, 101 ):
    print 100 - i

0

나는 codeacademy 연습 중 하나에서 이것을 시도했다 (역을 사용하지 않고 문자열에서 문자를 반전 : :: -1)

def reverse(text):
    chars= []
    l = len(text)
    last = l-1
    for i in range (l):
        chars.append(text[last])
        last-=1

    result= ""   
    for c in chars:
        result += c
    return result
print reverse('hola')

0

두 목록을 동시에 뒤로 반복하고 싶었으므로 음수 색인이 필요했습니다. 이것은 내 솔루션입니다.

a= [1,3,4,5,2]
for i in range(-1, -len(a), -1):
    print(i, a[i])

결과:

-1 2
-2 5
-3 4
-4 3
-5 1

0

오 알았어. 질문을 잘못 읽으면 배열에서 뒤로 이동하는 것 같아? 그렇다면, 나는 이것을 가지고 있습니다 :

array = ["ty", "rogers", "smith", "davis", "tony", "jack", "john", "jill", "harry", "tom", "jane", "hilary", "jackson", "andrew", "george", "rachel"]


counter = 0   

for loop in range(len(array)):
    if loop <= len(array):
        counter = -1
        reverseEngineering = loop + counter
        print(array[reverseEngineering])

귀하의 답변은 귀하가 작성한 테스트의 복사 붙여 넣기 인 것 같습니다. 최소한의 예를 게시하십시오 : 초기 질문 의 사용 globaltime관련이 없습니다.
Michael Doubez

-1

파이썬에서 커스텀 리버스 메커니즘을 만들 수도 있습니다. iterable을 뒤로 반복하기 위해 어디서나 사용할 수 있습니다.

class Reverse:
    """Iterator for looping over a sequence backwards"""
    def __init__(self, seq):
        self.seq = seq
        self.index = len(seq)

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index -= 1
        return self.seq[self.index]


>>> d = [1,2,3,4,5]
>>> for i in Reverse(d):
...   print(i)
... 
5
4
3
2
1

-2
a = 10
for i in sorted(range(a), reverse=True):
    print i

스택 오버플로에 오신 것을 환영합니다! 코드의 기능과 문제를 해결하는 이유에 대한 설명을 추가하려면 게시물을 수정하십시오. 작동하는 경우에도 대부분 코드 만 포함 된 답변은 OP가 문제를 이해하는 데 도움이되지 않습니다.
SuperBiasedMan

사용 sorted하면 불필요하게 전체 목록을 메모리에 저장 한다는 것을 알고 있습니까? 이것은 낭비이며, 큰 것은 불가능합니다 a.
Acumenus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.