簡體   English   中英

在 Python 中創建“反向”列表的最佳方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM