Python에서 항목이 다른 목록의 항목과 동일하지만 순서가 반대 인 새 목록을 만드는 가장 좋은 방법은 무엇입니까? (기존 목록을 수정하고 싶지 않습니다.)
다음은 나에게 발생한 한 가지 해결책입니다.
new_list = list(reversed(old_list))
복제 old_list
한 다음 제자리에서 복제 를 되돌릴 수도 있습니다 .
new_list = list(old_list) # or `new_list = old_list[:]`
new_list.reverse()
내가 간과 한 더 나은 옵션이 있습니까? 그렇지 않다면 위의 접근 방식 중 하나를 다른 것보다 사용해야하는 설득력있는 이유 (예 : 효율성)가 있습니까?
답변
newlist = oldlist[::-1]
[::-1]
반대로 -1 단계, 즉,와, 슬라이스 전체 순서 : 내 아내 애나는 “화성 스마일”;-) 수단 전화를 좋아하는 슬라이스 (. 모든 시퀀스에서 작동합니다.
이 항목 ( 및 언급 한 대안)은 “얕은 사본”과 동일합니다. 즉, 항목이 변경 가능하고 항목에 대해 mutator를 호출하면 원래 목록에있는 항목의 변경이 반전 된 목록 및 그 반대의 경우도 마찬가지입니다. 이를 피해야한다면 a copy.deepcopy
(항상 비용이 많이 드는 작업) 다음에이 경우 a .reverse
가 유일한 좋은 옵션입니다.
답변
이제 timeit
. 힌트 : Alex ‘s [::-1]
가 가장 빠릅니다. 🙂
$ p -m timeit "ol = [1, 2, 3]; nl = list(reversed(ol))"
100000 loops, best of 3: 2.34 usec per loop
$ p -m timeit "ol = [1, 2, 3]; nl = list(ol); nl.reverse();"
1000000 loops, best of 3: 0.686 usec per loop
$ p -m timeit "ol = [1, 2, 3]; nl = ol[::-1];"
1000000 loops, best of 3: 0.569 usec per loop
$ p -m timeit "ol = [1, 2, 3]; nl = [i for i in reversed(ol)];"
1000000 loops, best of 3: 1.48 usec per loop
$ p -m timeit "ol = [1, 2, 3]*1000; nl = list(reversed(ol))"
10000 loops, best of 3: 44.7 usec per loop
$ p -m timeit "ol = [1, 2, 3]*1000; nl = list(ol); nl.reverse();"
10000 loops, best of 3: 27.2 usec per loop
$ p -m timeit "ol = [1, 2, 3]*1000; nl = ol[::-1];"
10000 loops, best of 3: 24.3 usec per loop
$ p -m timeit "ol = [1, 2, 3]*1000; nl = [i for i in reversed(ol)];"
10000 loops, best of 3: 155 usec per loop
업데이트 : inspectorG4dget에서 제안한 list comp 메서드를 추가했습니다. 결과가 스스로 말하게 할 것입니다.
답변
조정
종종 불필요한 list()
변환 없이 ‘reversed’성능을 보여주는 sdolan의 timeit 계산에 대한 기준 벤치 마크 / 조정을 제공 할 가치가 있습니다. 이 list()
작업은 런타임에 추가 26 개의 usec를 추가하며 반복기가 허용되지 않는 경우에만 필요합니다.
결과 :
reversed(lst) -- 11.2 usecs
list(reversed(lst)) -- 37.1 usecs
lst[::-1] -- 23.6 usecs
계산 :
# I ran this set of 100000 and came up with 11.2, twice:
python -m timeit "ol = [1, 2, 3]*1000; nl = reversed(ol)"
100000 loops, best of 3: 11.2 usec per loop
# This shows the overhead of list()
python -m timeit "ol = [1, 2, 3]*1000; nl = list(reversed(ol))"
10000 loops, best of 3: 37.1 usec per loop
# This is the result for reverse via -1 step slices
python -m timeit "ol = [1, 2, 3]*1000;nl = ol[::-1]"
10000 loops, best of 3: 23.6 usec per loop
결론 :
이 테스트의 결론은 reversed()
슬라이스보다 [::-1]
12.4 usecs 더 빠릅니다.