在Python中创build“反向”列表的最佳方法是什么?

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

这是我遇到的一个解决scheme:

new_list = list(reversed(old_list)) 

也可以复制old_list然后反转重复的地方:

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

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

 newlist = oldlist[::-1] 

切片(我的妻子Anna喜欢称之为“火星人的笑脸”;-)是指:将整个序列切片,以-1为步长,即相反。 它适用于所有序列。

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

现在让我们来看看 提示: 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 

更新:添加由inspectorG4dgetbuild议的列表压缩方法。 我会让结果说明一切。

调整

这是值得提供一个基准基准/调整时间计算由sdolan显示performance“颠倒”没有经常不必要的列表()转换。 这个list()操作为运行时添加了26个usecs,仅在迭代器不可接受的情况下才需要。

结果:

 reversed(lst) -- 11.2 uses lst[::-1] --23.6 secs 

计算:

 # 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 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 

结论:

这些testing的结论是相反的()比12.4用途的slice [:: – 1]更快