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

时间:2010-09-14 02:06:21

标签: python reverse html-lists

在Python中,创建新列表的最佳方法是什么,其列表的项目与其他列表的项目相同,但顺序相反? (我不想修改现有的列表。)

以下是我遇到的一个解决方案:

new_list = list(reversed(old_list))

也可以复制old_list然后将副本反转到位:

new_list = list(old_list) # or `new_list = old_list[:]`
new_list.reverse()

我忽略了一个更好的选择吗?如果没有,是否有令人信服的理由(如效率)使用上述方法之一而不是另一种方法?

3 个答案:

答案 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