用Python创建“反向”列表的最佳方法是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (40)

在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的步骤,即逆转。它适用于所有序列。

请注意,这个等价于一个“shallow拷贝”,即:如果这些项目是可变的,并且你对它们调用了增变器,那么原始列表中保存的项目中的变化也会出现在反向列表,反之亦然。如果你需要避免这种情况,那么一个copy.deepcopy(虽然总是一个潜在的昂贵的操作),在这种情况下是一个.reverse,是唯一的选择。

用户回答回答于

使用timeit提示:[::-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

扫码关注云+社区

领取腾讯云代金券