range()
파이썬에서 다음 목록을 어떻게 만들 수 있습니까?
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
range()
파이썬에서 다음 목록을 어떻게 만들 수 있습니까?
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
답변:
사용 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)
덜 직관적 일 수 있지만 의견에서 언급했듯이 이것은 더 효율적이며 역순으로 범위를 올바르게 사용합니다.
range(10)
, 그렇지 않아야 range(9)
합니다. 또한 완전한 형식의 목록 (슬라이스 등)을 원하면을 수행해야 list(reversed(range(10)))
합니다.
reversed
일반적으로 생성기를 허용하지 않지만을 허용 range
합니다. 왜 reversed(range(10000))
전체 목록에 메모리를 할당해야합니까? 효율적인 역 반복을 허용 range
하는 __reversed__
메소드를 구현하는 객체를 반환 할 수 있습니까?
'범위'내장 기능을 사용하십시오. 서명은입니다 range(start, stop, step)
. 이렇게하면을 (를) 시작 하고을 (를) 제외하고 끝에 도달 start
하면 끝나는 시퀀스를 생성합니다 .stop
stop
>>> range(9,-1,-1)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> range(-2, 6, 2)
[-2, 0, 2, 4]
파이썬 3에서 이것은리스트가 아닌 range
객체를 생성하는데 , 이것은 읽기 전용리스트처럼 효과적으로 기능합니다 (그러나 특히 넓은 범위에서 메모리를 덜 사용합니다).
help(range)
파이썬 쉘에서 실행 하면 인수를 알려줍니다. 시작하는 숫자, 끝나는 숫자 (제외) 및 수행 할 단계이므로 9에서 시작하여 -1에 도달 할 때까지 1을 뺍니다. 범위)에서 종료 0
range(start, stop, step)
-숫자에서 시작 하여 매번 이동 start
하지 않으면 결과를 산출합니다 . stop
step
지금까지 수집 된 옵션의 "효율"에 관심이있는 사람들을 위해 ...
제이미 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 Neekman 의 range(n-1,-1,-1)
표기법을 사용하여 기억하기 쉽습니다 .
reverse
range 메소드가 역순으로리스트를 리턴 할 수 있기 때문에 사용이 불가능 합니다.n 개의 항목에 대해 반복이 있고 리턴 된 목록의 순서를 바꾸려면 범위를 식별 하고로 설정하는 범위의 세 번째 매개 변수range(start, stop, step)
를 사용해야 하며 다른 매개 변수는 그에 따라 조정됩니다.step
-1
-1
(이전 값은 stop - 1
이고 stop
같음 0
).n-1
.따라서 range (n)과 반대 순서는 다음과 같습니다.
n = 10
print range(n-1,-1,-1)
#[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
reversed(range(n))
가독성이 제쳐두고 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)
습니까?
이 질문의 요구 사항은 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]
-1
정말로 좋아한다. 유지하기 쉽도록하는 것은 정확히이 패턴 이다 wrap one's head around this
.-오늘 나는 그것이 정말로 효율적이어야 한다면 , range(n-1, -1, -1)
역순으로 범위를 횡단 할 때 사용 한다는 것을 배웠다 .
매우 자주 묻는 질문은 Python 3 range(9, -1, -1)
보다 나은지 여부입니다 reversed(range(10))
. 반복자를 사용하여 다른 언어로 작업 한 사람들은 즉시 reversed ()가 모든 값을 캐시 한 다음 역순으로 리턴해야한다고 생각하는 경향이 있습니다. reversed()
객체가 단지 반복자 인 경우 Python의 연산자가 작동하지 않는다는 것입니다. reversed ()가 작동하려면 객체에 2 개 중 하나가 있어야합니다.
len()
통해 지원 및 정수 인덱스[]
__reversed__()
메소드를 구현하십시오.위의 항목이없는 객체에서 reversed ()를 사용하려고하면 다음과 같은 결과가 나타납니다.
>>> [reversed((x for x in range(10)))]
TypeError: 'generator' object is not reversible
간단히 말해서 파이썬 reversed()
은 객체와 같은 배열에서만 의미가 있으므로 순방향 반복과 동일한 성능을 가져야합니다.
그러나 어떻 range()
습니까? 발전기가 아닌가? 파이썬 3에서는 생성자이지만 위의 두 가지를 모두 구현하는 클래스에 싸여 있습니다. 그래서range(100000)
많은 메모리를 차지하지는 않지만 여전히 효율적인 인덱싱 및 역전을 지원합니다.
따라서 요약하자면 reversed(range(10))
성능 저하없이 사용할 수 있습니다 .
range(9,-1,-1)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
reversed(range(10))
오류가 적은 이유를 보여줍니다 . 공격적인 Asinox가 없습니다. 정직한 관찰.
많은 사람들이 (나 자신처럼) 기존 목록을 역순 으로 순회하는 일반적인 경우에 더 관심이있을 수 있다고 생각했습니다. .
비록이 경우에는 모든 정답이 여전히 완벽하게 훌륭하지만 Wolf의 답변 에서 수행 된 성능 비교 는 인덱스 만 생성 한다는 것을 지적하고 싶습니다 . 그래서 기존 목록을 역순으로 순회하는 비슷한 벤치 마크를 만들었습니다.
TL; DR a[::-1]
이 가장 빠릅니다.
전제 조건 :
a = list(range(10))
%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)
%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 테스트