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

时间:2015-04-07 18:18:53

标签: python

我想要旋转列表中的元素,例如 - 将列表元素向右移动,以便['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])

14 个答案:

答案 0 :(得分:6)

您可以将负索引与列表连接一起使用:

def shift(seq, n=0):
    a = n % len(seq)
    return seq[-a:] + seq[:-a]

答案 1 :(得分:2)

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

#! /usr/bin/python3

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

结果:

[2, 3, 4, 1]

答案 2 :(得分:2)

如果您对切片符号过敏: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]

答案 3 :(得分:1)

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

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

这两个都改变了原始列表。

答案 4 :(得分: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]

答案 5 :(得分:1)

这个问题似乎暗示我应该修改列表本身而不是创建新列表。因此,一个简单的到位算法是:

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]

答案 6 :(得分:1)

您可以将列表中的最后一个元素切片,然后将其添加到新列表的开头:

aList = [aList[-1]] + aList[:-1]

结果如下:

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

答案 7 :(得分:0)

使用一个函数,假设n的移位小于列表l的长度,如下所示:

shift = lambda l, n: l[-n:] + l[:-n] # i.e. shift([1, 2, 3, 4], 3)

答案 8 :(得分:0)

这可以通过使用list方法完成: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

打印(移(值))

输出是:

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

答案 9 :(得分:0)

您可以使用此:

li=li[-1:]+li[:-1]

答案 10 :(得分:0)

您的查询解决方案:

def shift(aList):
    l = list()
    n = len(aList)
    l.append(aList[-1])
    temp = aList[:n-1]
    for i in temp:
        l.append(i)
    return l
print(shift(aList=[1,2,3]))

答案 11 :(得分:0)

您可以使用 numpy 中的 roll 函数。

>>> import numpy as np
>>> q = [1, 2, 3, 4, 5]
>>> np.roll(q, 2)
array([4, 5, 1, 2, 3])

希望有帮助!

答案 12 :(得分:0)

右移和左移功能:

def left_shift(seq, n=0):
    a = n % len(seq)
    return seq[1:] + [seq[0]]

def right_shift(seq, n=0):
    a = n % len(seq)
    return seq[-a:] + seq[:-a]

seq=right_shift(seq,1)

答案 13 :(得分:0)

您可以使用带有“+”的列表切片

左移

def left_shift(seq):
    return seq[1:]+[seq[0]]

右移

def right_shift(seq):
    return seq[-1:]+seq[:-1]
相关问题