range ()와 역순으로 목록을 인쇄 하시겠습니까?


364

range()파이썬에서 다음 목록을 어떻게 만들 수 있습니까?

[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

[* range (9, -1, -1)]은 어떻습니까? 슈퍼 파이 토닉!
onofricamila

답변:


561

사용 reversed()기능 :

reversed(range(10))

훨씬 더 의미가 있습니다.

최신 정보:

btk가 지적한 것처럼 목록이되고 싶다면 :

list(reversed(range(10)))

최신 정보:

range동일한 결과를 얻기 위해서만 사용하려는 경우 모든 매개 변수를 사용할 수 있습니다.range(start, stop, step)

예를 들어, list를 생성 [5,4,3,2,1,0]하려면 다음을 사용할 수 있습니다.

range(5, -1, -1)

덜 직관적 일 수 있지만 의견에서 언급했듯이 이것은 더 효율적이며 역순으로 범위를 올바르게 사용합니다.


13
비록 덜 효율적이지만. 그리고 당신은 그것에 슬라이스 작업을 수행 할 수 없습니다.
Jakob Bowyer

6
이 답변은 매우 명확하고 이해하기 쉽지만 range(10), 그렇지 않아야 range(9)합니다. 또한 완전한 형식의 목록 (슬라이스 등)을 원하면을 수행해야 list(reversed(range(10)))합니다.
John Y

5
이로 인해 반복자가 생성되고 OP는 목록 형식의 결과를 요청했습니다.
btk

6
파이썬 생성기와 함께 "리버스 드 (reversed)"를 사용하는 것은 (파이썬 3 범위 내장에 대해 이야기하고 있다고 가정 할 때) 개념 상 잘못되었으며 고급 언어로 프로그래밍 할 때 메모리 / 프로세싱 복잡성을 고려하지 않는 잘못된 습관을 가르칩니다.
thedk

7
Python3에서는 reversed일반적으로 생성기를 허용하지 않지만을 허용 range합니다. 왜 reversed(range(10000))전체 목록에 메모리를 할당해야합니까? 효율적인 역 반복을 허용 range하는 __reversed__메소드를 구현하는 객체를 반환 할 수 있습니까?
avmohan

312

'범위'내장 기능을 사용하십시오. 서명은입니다 range(start, stop, step). 이렇게하면을 (를) 시작 하고을 (를) 제외하고 끝에 도달 start하면 끝나는 시퀀스를 생성합니다 .stopstop

>>> range(9,-1,-1)   
    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> range(-2, 6, 2)
    [-2, 0, 2, 4]

파이썬 3에서 이것은리스트가 아닌 range객체를 생성하는데 , 이것은 읽기 전용리스트처럼 효과적으로 기능합니다 (그러나 특히 넓은 범위에서 메모리를 덜 사용합니다).


1
여러분이이 설명해 주시겠습니까, 또한 당신은 내게 파이썬에 대한 모든 웹 사이트 / PDF 책 추천 바랍니다 수 있습니다
ramesh.mimit

8
@ramesh help(range)파이썬 쉘에서 실행 하면 인수를 알려줍니다. 시작하는 숫자, 끝나는 숫자 (제외) 및 수행 할 단계이므로 9에서 시작하여 -1에 도달 할 때까지 1을 뺍니다. 범위)에서 종료 0
마이클 Mrozek에게

3
@ ramesh.mimit : 공식 파이썬 사이트로 가십시오. 훌륭한 튜토리얼을 포함한 전체 문서가 있습니다.
John Y

5
실제로 이것은 정답이지만 더 명확하게 설명 할 수 있습니다. range(start, stop, step) -숫자에서 시작 하여 매번 이동 start하지 않으면 결과를 산출합니다 . stopstep
Mr. B

43

일반적인 파이썬 관용구에 익숙한 경우와 range(10)[::-1]동일 range(9, -1, -1)하고 더 읽기 쉬운 것을 사용할 수 있습니다 sequence[::-1].


28

지금까지 수집 된 옵션의 "효율"에 관심이있는 사람들을 위해 ...

제이미 RGP의 대답은 나를 이끌어 내 컴퓨터를 다시 시작한, 타이밍 의 다소 '도전 "솔루션 제이슨 문자 (코멘트를 통해) 내 자신의 제안 다음. 다운 타임에 대한 궁금증을 해소하기 위해 여기에 내 결과를 제시합니다 (최악).

Jason의 답변 ( 목록 이해 의 힘에 대한 여행 일 수 있습니다 ) :

$ python -m timeit "[9-i for i in range(10)]"
1000000 loops, best of 3: 1.54 usec per loop

martineau의 답변 ( 확장 슬라이스 구문에 익숙한 경우 읽을 수 있음 ) :

$ python -m timeit "range(10)[::-1]"
1000000 loops, best of 3: 0.743 usec per loop

Michał Šrajer의 답변 (허용되는 답변 )

$ python -m timeit "reversed(range(10))"
1000000 loops, best of 3: 0.538 usec per loop

bene 's answer (최초이지만 그 당시의 스케치 ) :

$ python -m timeit "range(9,-1,-1)"
1000000 loops, best of 3: 0.401 usec per loop

마지막 옵션은 Val Neekmanrange(n-1,-1,-1)표기법을 사용하여 기억하기 쉽습니다 .


3
나는이 답변을 읽기 전에 내 자신의 타이밍을했고 동일한 결과를 얻었습니다.
Todd Owen

13
for i in range(8, 0, -1)

이 문제를 해결할 것입니다. 그것은 8 대 1을 출력 할 것이고, -1은 반대로 된 목록을 의미합니다


10

reverserange 메소드가 역순으로리스트를 리턴 할 수 있기 때문에 사용이 불가능 합니다.

n 개의 항목에 대해 반복이 있고 리턴 된 목록의 순서를 바꾸려면 범위를 식별 하고로 설정하는 범위의 세 번째 매개 변수range(start, stop, step) 를 사용해야 하며 다른 매개 변수는 그에 따라 조정됩니다.step-1

  1. 중지 매개 변수를로 제공하십시오 -1(이전 값은 stop - 1이고 stop같음 0).
  2. 시작 매개 변수로을 사용하십시오 n-1.

따라서 range (n)과 반대 순서는 다음과 같습니다.

n = 10
print range(n-1,-1,-1) 
#[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

6
솔직히 나는 이것보다 덜 직관적이라고 생각합니다reversed(range(n))
Nicholas Hamilton

1
@NicholasHamilton 동의하지만, 그 대답 뒤에 숨겨진 아이디어는 적은 자원을 사용하는 것입니다 ... (질문은 범위 기능을 사용하는 것에 관한 것입니다 :))
Andriy Ivaneyko

좋아요, 걱정하지 마세요. 상황에 따라 다릅니다. 예를 들어, range 함수가 루프의 인덱스로 사용되면 효과가 제한적이지만 외부 루프 내부에서 사용되는 경우 비용이 많이 발생합니다.
Nicholas Hamilton

8

가독성이 제쳐두고 reversed(range(n))보다 빠릅니다 range(n)[::-1].

$ python -m timeit "reversed(range(1000000000))"
1000000 loops, best of 3: 0.598 usec per loop
$ python -m timeit "range(1000000000)[::-1]"
1000000 loops, best of 3: 0.945 usec per loop

누군가 궁금해하는 경우 :)


:)-왜 추가하지 않았 range(1000000000-1,-1,-1)습니까?
Wolf

... 더 나은 timeit range(1000000000-1,-1,-1)커맨드 라인을 시도하지 말고 대신 내 결과를보십시오 :-)
Wolf

6

이 질문의 요구 사항은 list내림차순으로 10 크기의 정수를 요구합니다. 파이썬으로리스트를 만들어 봅시다.

# This meets the requirement.
# But it is a bit harder to wrap one's head around this. right?
>>> range(10-1, -1, -1)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

# let's find something that is a bit more self-explanatory. Sounds good?
# ----------------------------------------------------

# This returns a list in ascending order.
# Opposite of what the requirement called for.
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# This returns an iterator in descending order.
# Doesn't meet the requirement as it is not a list.
>>> reversed(range(10))
<listreverseiterator object at 0x10e14e090>

# This returns a list in descending order and meets the requirement
>>> list(reversed(range(10)))
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

2
나는 트리플을-1 정말로 좋아한다. 유지하기 쉽도록하는 것은 정확히이 패턴 이다 wrap one's head around this.-오늘 나는 그것이 정말로 효율적이어야 한다면 , range(n-1, -1, -1)역순으로 범위를 횡단 할 때 사용 한다는 것을 배웠다 .
Wolf

5

range () BIF Like로 역 번호를 인쇄 할 수 있습니다.

for number in range ( 10 , 0 , -1 ) :
    print ( number ) 

출력은 [10,9,8,7,6,5,4,3,2,1]입니다.

range ()-시작 (포함, 시작, 종료, 증분 / 감소) 시작이 포함되고 종료가 배타적이며 증가는 임의의 숫자 일 수 있으며 단계처럼 동작합니다.


5

매우 자주 묻는 질문은 Python 3 range(9, -1, -1)보다 나은지 여부입니다 reversed(range(10)). 반복자를 사용하여 다른 언어로 작업 한 사람들은 즉시 reversed ()가 모든 값을 캐시 한 다음 역순으로 리턴해야한다고 생각하는 경향이 있습니다. reversed()객체가 단지 반복자 인 경우 Python의 연산자가 작동하지 않는다는 것입니다. reversed ()가 작동하려면 객체에 2 개 중 하나가 있어야합니다.

  1. 다음을 len()통해 지원 및 정수 인덱스[]
  2. 또는 __reversed__()메소드를 구현하십시오.

위의 항목이없는 객체에서 reversed ()를 사용하려고하면 다음과 같은 결과가 나타납니다.

>>> [reversed((x for x in range(10)))]
TypeError: 'generator' object is not reversible

간단히 말해서 파이썬 reversed()은 객체와 같은 배열에서만 의미가 있으므로 순방향 반복과 동일한 성능을 가져야합니다.

그러나 어떻 range()습니까? 발전기가 아닌가? 파이썬 3에서는 생성자이지만 위의 두 가지를 모두 구현하는 클래스에 싸여 있습니다. 그래서range(100000) 많은 메모리를 차지하지는 않지만 여전히 효율적인 인덱싱 및 역전을 지원합니다.

따라서 요약하자면 reversed(range(10))성능 저하없이 사용할 수 있습니다 .


3

나는 이것이 도움이 될 수 있다고 생각합니다.

range(5)[::-1]

아래는 사용법입니다.

for i in range(5)[::-1]:
    print i 

3
range(9,-1,-1)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

13
귀하의 답변은 reversed(range(10))오류가 적은 이유를 보여줍니다 . 공격적인 Asinox가 없습니다. 정직한 관찰.
Michał Šrajer

잘못된 답변을 표시하는 것이 표준인지는 잘 모르겠습니다. 본인이나 다른 사람이 수정하거나 제거 할 수 있습니까?
sinekonata

3
@ sin, nope 그냥 떠나서 어떻게 3 개의 투표를 축적했는지 궁금합니다 ... 삭제했는지 여부를 알지 못하고 중재자 관심 ( 18 개월 이전 의 답변이 중복 되지 않음)으로 표시 할 수 있다고 생각합니다.
OGHaza

모든 미래 참고 : 코드는 VLQ하지 않습니다 , 그리고 오답은 어느 플래그가 안된다 . NA를 사용하든 모드 플래그를 사용하든,이 경우에는 다운 보트 및 이동으로 플래그가 잘못되었습니다. - 리뷰에서
Zoe

2

[::-1]없이 사용하거나 반대로-

def reverse(text):
    result = []
    for index in range(len(text)-1,-1,-1):
        c = text[index]
        result.append(c)
    return ''.join(result)

print reverse("python!")

6
왜 누군가 대신 이것을 써야 "python!"[::-1]합니까?
Daniel


1

range 함수를 반드시 사용할 필요는 없습니다. list [::-1]을 사용하면 추가를 사용하지 않고 목록을 역순으로 신속하게 반환해야합니다.


이것은 이전 답변 에서 제안 된 해결책 인 것 같습니다 . 또한 이전의 다른 답변에 대해 의견을 말하려고 할 수도 있습니다. 그렇게하기 전에 좀 더 명성을 얻어야합니다.
Grisha Levit

1

리스트가 a = {1,2,3,4,5}라고 가정 해 봅시다. 이제리스트를 반대로 인쇄하려면 다음 코드를 사용하십시오.

a.reverse
for i in a:
   print(i)

나는 당신이 범위를 사용하여 요청했지만 그 대답은 이미 알고 있습니다.


0
range(9,-1,-1)
    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

올바른 양식입니다. 당신이 사용하는 경우

reversed(range(10))

당신은 0 사건을 얻지 못할 것입니다. 예를 들어 10은 마법 번호가 아니며 조회에 사용하는 변수가 역순으로 시작한다고 가정하십시오. n 경우가 0이면 reversed (range (0))이 실행되지 않습니다. 우연히 0 인덱스에 단일 객체가 있으면 잘못된 것입니다.


0

많은 사람들이 (나 자신처럼) 기존 목록을 역순 으로 순회하는 일반적인 경우에 더 관심이있을 수 있다고 생각했습니다. .

비록이 경우에는 모든 정답이 여전히 완벽하게 훌륭하지만 Wolf의 답변 에서 수행 된 성능 비교 는 인덱스 만 생성 한다는 것을 지적하고 싶습니다 . 그래서 기존 목록을 역순으로 순회하는 비슷한 벤치 마크를 만들었습니다.

TL; DR a[::-1] 이 가장 빠릅니다.

전제 조건 :

a = list(range(10))

Jason의 답변 :

%timeit [a[9-i] for i in range(10)]
1.27 µs ± 61.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

마르티노의 답변 :

%timeit a[::-1]
135 ns ± 4.07 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

Michał Šrajer의 답변 :

%timeit list(reversed(a))
374 ns ± 9.87 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

베네의 대답 :

%timeit [a[i] for i in range(9, -1, -1)]
1.09 µs ± 11.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

보시다시피,이 경우 명시 적으로 인덱스를 생성 할 필요가 없으므로 가장 빠른 방법은 추가 작업을 줄이는 방법입니다.

NB : 편리한 "magic command"를 가진 JupyterLab에서 테스트했습니다 %timeit. timeit.timeit후드 아래에서 표준 을 사용합니다 . 파이썬 3.7.3 테스트

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