当前位置:  开发笔记 > 编程语言 > 正文

python将列表的所有元素向右移动一个

如何解决《python将列表的所有元素向右移动一个》经验,为你挑选了2个好方法。

因此,我想将所有元素移到右侧,例如,如果我有一个列表,[1, 2, 3, 4, 5]它将成为[5, 1, 2, 3, 4].所以基本上最右边的元素包裹到最左边的元素,其他元素基本上向右移动.

这是我的代码:

length = len(values)
old_right = values[length - 1]
for j in range(length - 1, 0, -1):
    values[j] = values[j - 1]
values[0] = old_right

当我在空闲状态下进入时,我在值[0]的最后一行得到一个错误(在值上突出显示)SyntaxError: invalid syntax.我不知道为什么会出现这个错误.

此外,我将如何更改我的代码以使其从[5, 4, 3, 2, 1]后面返回[1, 2, 3, 4, 5],即反转过程?



1> timgeb..:
>>> lst = [1, 2, 3, 4, 5]
>>> [lst[-1]] + lst[:-1]
[5, 1, 2, 3, 4]

相反:

>>> lst = [5, 1, 2, 3, 4]
>>> lst[1:] + [lst[0]]
[1, 2, 3, 4, 5]

编辑:

我用[1,2,3,4,5]作为一个例子,但我写的代码为它的任何名单上的工作,无论是它会采取左侧列表中的最右边的值是什么.在您的情况下,这确实有效,但仅在您指定特定列表时才有效.我想知道你会怎么做,所以它适用于任何一般情况.

然后写一个函数.

def shift_right(lst):
    try:
        return [lst[-1]] + lst[:-1]
    except IndexError:
        return lst


@timgeb你可以使用`lst [-1:] + lst [: - 1]`而不是`[lst [-1]] + lst [: - 1]`.
@ RenanV.Novas,为什么不只是`lst [:: - 1]`?

2> Erik Godard..:

使用deque模块。

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

a = list(a)

这是理想的解决方案,因为它使您可以将列表旋转任意数量的位置。如果要以其他方式旋转它,可以将参数设为rotate负数。

编辑:

当前接受的答案比这种方法要慢得多。优化了双端队列数据结构,以便在列表的开头和列表的末尾插入,这比接受的答案的线性时间操作快得多。在OP使用代码的上下文中,这可能无关紧要,但是在性能至关重要的任何上下文中,双端队列是必经之路。

我编写了一个小程序,该程序将一个位置的1,000,000个元素的列表旋转1000次。这是结果

List Slicing: 0:00:12.043186
Deque: 0:00:00.028064

代码在这里。

import datetime
from collections import deque


start = datetime.datetime.now()

lst = [1]* 1000000

#first approach
for x in range(1000):
    lst = [lst[-1]] + lst[:-1]

end  = datetime.datetime.now()
print end - start

lst = deque(lst)
#second approach 
for y in range(1000):
    lst.rotate(1)
lst = list(lst)

start = datetime.datetime.now()
print start - end

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有