代码之家  ›  专栏  ›  技术社区  ›  davidchambers

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

  •  79
  • davidchambers  · 技术社区  · 14 年前

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

    我想到了一个解决方案:

    new_list = list(reversed(old_list))
    

    也可以复制 old_list 然后将副本倒过来:

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

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

    3 回复  |  直到 6 年前
        1
  •  189
  •   Alex Martelli    14 年前
    newlist = oldlist[::-1]
    

    这个 [::-1] 切片(我妻子安娜喜欢称之为“火星笑脸”)的意思是:切片整个序列,步骤为-1,即反向。它适用于所有序列。

    注意这个( 您提到的替代品)相当于一个“浅拷贝”,即:如果项目是可变的,并且您在它们上调用了变异子,那么原始列表中保存的项目中的突变也在反向列表中的项目中,反之亦然。如果你需要避免,一个 copy.deepcopy (尽管总是一个潜在的昂贵的操作),在这种情况下, .reverse ,是唯一的好选择。

        2
  •  49
  •   Sam Dolan    14 年前

    现在让我们 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
    

    更新: 增加了inspectorg4dget建议的列表comp方法。我会让结果说明一切。

        3
  •  7
  •   Ivan Jeffrey Zhao    6 年前

    调整

    值得为sdolan的时间计算提供基线基准/调整,该基准/调整显示“反向”的性能,而不需要 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美元