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