[英]Best way to create a "reversed" list in 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,即反向。 它適用於所有序列。
請注意,這(以及您提到的替代方案)等效於“淺拷貝”,即:如果項目是可變的並且您對它們調用了增變器,則原始列表中保存的項目中的變化也在反轉列表,反之亦然。 如果你需要避免這種情況, copy.deepcopy
(雖然總是一個潛在的代價高昂的操作),在這種情況下是一個.reverse
,是唯一的好選擇。
現在讓我們timeit
。 提示: Alex 的[::-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 方法。 我會讓結果不言自明。
值得為 sdolan 的 timeit 計算提供基准基准/調整,它顯示了“反向”的性能,而沒有通常不必要的list()
轉換。 此list()
操作向運行時添加了額外的 26 微秒,並且僅在迭代器不可接受的情況下才需要。
結果:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.