将列表元素向右移动,并将列表末尾的元素移到开头

12

我想要将列表中的元素进行旋转,例如向右移动列表元素,使得['a','b','c','d']变成['d','a','b','c']或者[1,2,3]变成[3,1,2]

我尝试了下面的代码,但它并没有起作用:

def shift(aList):
    n = len(aList)
    for i in range(len(aList)):
        if aList[i] != aList[n-1]:
            aList[i] = aList[i+1]
             return aList
         elif aList[i] == aList[i-1]:
            aList[i] = aList[0]
            return aList
shift(aList=[1,2,3])

我正在尝试将元素向右移动,使得 ['a','b','c','d'] 变为 ['d','a','b','c']。 - nesman
1
忽略所有临时列表的创建,你可以简单地使用以下代码进行旋转: 对于循环移动一个元素:a[:] = a[1:] + a[:1] 对于移动任意数量(n)的元素:a[:] = a[n:] + a[:n] - AChampion
复制一下 - 让我看看我是不是找到了那个。 - Patrick Artner
16个回答

15
你可以将负索引与列表连接一起使用:
def shift(seq, n=0):
    a = n % len(seq)
    return seq[-a:] + seq[:-a]

12
如果你对切片操作过敏:a.insert(0,a.pop()) 用法:
In [15]: z=[1,2,3]

In [16]: z.insert(0,z.pop())

In [17]: z
Out[17]: [3, 1, 2]

In [18]: z.insert(0,z.pop())

In [19]: z
Out[19]: [2, 3, 1]

11

如果您想要移动元素,请使用collections.dequerotate方法:

#! /usr/bin/python3

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

结果:

[2, 3, 4, 1]

使用切片,您正在进行反转而不是移位。 - Malik Brahimi
@MalikBrahimi:我知道,但问题不清楚,所以我不确定他是想转移还是反转。 - aldeb

7
您可以使用这个:
li=li[-1:]+li[:-1]

6
你可以将列表的最后一个元素切片,然后添加到一个新列表的开头:
aList = [aList[-1]] + aList[:-1]

这是结果:

>>> aList = [1,2,3]
>>> aList = [aList[-1]] + aList[:-1]
>>> aList
[3, 1, 2]

3
这个问题似乎暗示我们应该修改列表本身而不是创建一个新的列表。因此,一个简单的原地算法如下:
lst = [1, 2, 3, 4, 5]

e1 = lst[-1]
for i, e2 in enumerate(lst):
    lst[i], e1 = e1, e2

print(lst)

提供:

[5, 1, 2, 3, 4]

2

如果您真的想要移动元素,可以使用模运算循环列表并将元素重新分配到它们的移动位置:

def shift(lst, shft=0):
    ln = len(lst)
    for i, ele in enumerate(lst[:]):
        lst[(i + shft) % ln] = ele
    return lst

In [3]: shift( ['a','b','c','d'] , 1)
Out[3]: ['d', 'a', 'b', 'c']

In [4]: shift( ['a','b','c','d'] , 2)
Out[4]: ['c', 'd', 'a', 'b']

In [5]: shift( ['a','b','c','d'] , 3)
Out[5]: ['b', 'c', 'd', 'a']

如果您只想进行一次移位,只需将最后一个元素移到前面并扩展列表即可:
def shift(lst):
    lst[0:1] = [lst.pop(),lst[0]]
    return lst

这两种方法都会改变原始列表。


1

使用切片语法的简单示例:

def shift(seq):
    return [seq[-1]] + seq[:-1]

assert shift([1, 2, 3, 4, 5]) == [5, 1, 2, 3, 4]

通用版本,具有可变换移位:

def shift(seq, shift=1):
    return seq[-shift:] + seq[:-shift]

assert shift([1, 2, 3, 4, 5]) == [5, 1, 2, 3, 4]
assert shift([1, 2, 3, 4, 5], 2) == [4, 5, 1, 2, 3]

0
使用一个函数,假设n是小于列表l的长度的移位量,可以像下面这样使用:
shift = lambda l, n: l[-n:] + l[:-n] # i.e. shift([1, 2, 3, 4], 3)

0

这可以通过使用列表方法insert来简单完成。

values = [2, 3, 5, 7, 11, 13]

def shift(list):
    new_list = []

    for i in list:
        new_list.insert(len(new_list)-1, i)

    return new_list

打印(shift(values))

输出为:

[3, 5, 7, 11, 13, 2]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接