Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python将列表中的所有元素向右移动一步_Python_Python 3.x - Fatal编程技术网

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

python将列表中的所有元素向右移动一步,python,python-3.x,Python,Python 3.x,因此,我想将所有元素向右移动,例如,如果我有一个[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 当我在idle中输入它时,我在

因此,我想将所有元素向右移动,例如,如果我有一个
[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
当我在idle中输入它时,我在值[0]的最后一行(在值上突出显示)上得到一个错误,它说
SyntaxError:invalid syntax
。我不知道为什么会出现这个错误

此外,我必须如何更改代码,使其从
[5,4,3,2,1]
返回到
[1,2,3,4,5]
,即反向过程

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

使用
deque
模块

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

a = list(a)
这是理想的解决方案,因为它允许您将列表旋转任意多个位置。如果要以另一种方式旋转,可以将参数设置为
rotate
负值

编辑:

目前公认的答案比这种方法慢得多。deque数据结构经过优化,可插入列表的开头和末尾,这比接受答案的线性时间运算快得多。在OP使用代码的上下文中,这可能并不重要,但在任何性能重要的上下文中,deque都是一条出路

我编写了一个小程序,将1000000个元素的列表按一个位置旋转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

我不会考虑这个想法的情况,因为你可以用一个列表切片、任意数量的地方和所有的东西来做同样的事情,而不必做一个导入和/或把DeGo对象作为一个列表。@ RNAR,如果OP正在做很多事情,那么使用DEQE会更有效。与第一个答案中的线性方法相比,这是一个恒定的工作。这一点很好。想知道列表转换是否仍然是持续工作?deque会做什么?@erik,你可能会发现时间lib比日期-时间模块更适合计时代码我喜欢你的方法,因为它更简单,但如果你分配了一个列表,对我来说,这只是任何列表的一般情况,它都可以执行操作。@JerryMichaels我不理解你的评论。@timgeb你可以使用
lst[-1:]+lst[:-1]
而不是
[lst[-1]]+lst[:-1]
@RenanV.Novas,为什么不直接使用
lst[:-1]
?@padraickenningham我不知道这个解决方案!伟大的解决方案!这比切片速度快。这也改变了原始的list@PadraicCunningham确实如此,跳过重新分配列表的需要是速度的一部分。尽管最初的问题没有任何要求,但它的示例显示了一个适当的更新。@Dalen-
timeit
告诉我,在一个百万成员的列表中,这要快20倍。你的测量结果告诉了你什么?@tdelaney,是的,如果你不打算使用deque,这肯定是更好的方法
a = [1,2,3,4,5]
x = a.pop()
a.insert(0, x)