[python] 파이썬에서 “역전 된”목록을 만드는 가장 좋은 방법은 무엇입니까?

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 더 빠릅니다.


답변