好的,我有一个列表,我想在列表的最后一个元素之前移动列表开头的元素数,其中最后一个元素表示我需要移动的元素数。
例如:[2, 19, 6, 26, 1, 15, 12, 3]
,由于最后一个元素是3,结果看起来像[26, 1, 15, 12, 2, 19, 6, 3]
。有谁知道我怎么能用这种方式索引列表?
答案 0 :(得分:3)
要获取列表的最后一项,您可以使用-1
索引(l[-1]
)。
要获取列表的第一个n
项,请从0切换到n
(l[0:n]
); Python将省略初始0
。
要将n
中的元素添加到列表中的倒数第二个项目,请从n
切换到-1
(l[n:-1]
)。
把这些放在一起,你会使用类似的东西:
def move_items(lst):
return lst[lst[-1]:-1] + lst[:lst[-1]] + [lst[-1]]
行动中:
>>> def move_items(lst):
... return lst[lst[-1]:-1] + lst[:lst[-1]] + [lst[-1]]
...
>>> move_items([2,19,6,26,1,15,12,3])
[26, 1, 15, 12, 2, 19, 6, 3]
答案 1 :(得分:1)
def split(x):
y = x[:] # make a copy: not to harm incoming list
numToMove = y.pop()
return (numToMove, y[:numToMove], y[numToMove:])
a = [2, 19, 6, 26, 1, 15, 12, 3]
(num, head, tail) = split(a)
answer = tail + head + [num]
答案 2 :(得分:0)
试试这个:
l = [2, 19, 6, 26, 1, 15, 12, 3]
l2 = l[l[-1]:-1] + l[:l[-1]] + [l[-1]]
print l2
答案 3 :(得分:0)
使用modulo的版本创建单个列表而不切片:
def swap(l):
i, ln = l[-1], len(l) - 1
for j in range(ln):
yield l[(i + j) % ln]
yield i
输出:
In [2]: l = [2, 19, 6, 26, 1, 15, 12, 3]
In [3]: list(swap(l))
Out[3]: [26, 1, 15, 12, 2, 19, 6, 3]
或使用collections.deque
:
from collections import deque
def swap(l):
ln, deq = len(l) - 1, deque(l)
i = deq.pop()
deq.rotate(ln - i), deq.append(i)
return deq
更精简版但使用更多内存:
def swap(l):
i, ln = l[-1], len(l) - 1
return [l[(i + j)% ln] for j in range(ln)] + [i]
如果最后一个数字是>,不确定会发生什么列表的长度,使用modulo将意味着循环切片将增加列表添加重复元素的列表,您可能希望专门处理该情况。