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

移动值但保留python列表中的顺序[重复]

  •  8
  • sloth  · 技术社区  · 15 年前

    这个问题已经有了答案:

    我有一个清单

    a=[1,2,3,4,5]
    

    并希望“移动”其值,使其变为

    a=[2,3,4,5,1]
    

    下一步呢

    a=[3,4,5,1,2]
    

    在python中是否有一个内置函数可以做到这一点?

    或者有比这更短更好的方法吗

    b=[a[-1]]; b.extend(a[:-1]); a=b
    
    1 回复  |  直到 10 年前
        1
  •  25
  •   Miles    15 年前
    >>> a = [1,2,3,4,5]
    >>> a.append(a.pop(0))
    >>> a
    [2, 3, 4, 5, 1]
    

    不过,这是很昂贵的,因为它必须改变整个列表的内容,即O(N)。更好的选择可能是使用 collections.deque 如果它在您的Python版本中可用,它允许对象在大约0(1)次内从两端插入和移除:

    >>> a = collections.deque([1,2,3,4,5])
    >>> a
    deque([1, 2, 3, 4, 5])
    >>> a.rotate(-1)
    >>> a
    deque([2, 3, 4, 5, 1])
    

    还要注意,这两个解决方案都涉及更改原始序列对象,而您的解决方案则创建一个新列表并将其分配给 a . 如果我们做到了:

    >>> c = a
    >>> # rotate a
    

    用你的方法, c 将继续引用原始的未汇总的列表,使用我的方法,它将引用更新的, 旋转的 名单/迪克。