在Python中,创建新列表的最佳方法是什么,其列表的项目与其他列表的项目相同,但顺序相反? (我不想修改现有的列表。)
以下是我遇到的一个解决方案:
new_list = list(reversed(old_list))
也可以复制old_list
然后将副本反转到位:
new_list = list(old_list) # or `new_list = old_list[:]`
new_list.reverse()
我忽略了一个更好的选择吗?如果没有,是否有令人信服的理由(如效率)使用上述方法之一而不是另一种方法?
答案 0 :(得分:190)
newlist = oldlist[::-1]
[::-1]
切片(我的妻子安娜喜欢称之为“火星人的笑脸”;-)表示:切片整个序列,步长为-1,即相反。它适用于所有序列。
请注意,这(和您提到的替代方案)相当于“浅层副本”,即:如果项目是可变的并且您在其上调用mutators,则保留的项目中的突变原始列表也在反转列表中的项目中,反之亦然。如果你需要避免这种情况,那么copy.deepcopy
(虽然总是一个可能很昂贵的操作),在这种情况下由.reverse
跟随,是唯一的好选择。
答案 1 :(得分:51)
现在让我们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建议的列表comp方法。我会让结果说明一切。
答案 2 :(得分:7)
值得为sdolan的时间计算提供基线基准/调整,以显示“反转”的表现。没有经常不必要的list()
转换。此list()
操作会向运行时添加额外的26个usecs,仅在迭代器不可接受的情况下才需要。
<强>结果:强>
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