在列表python中的最后一个元素之前移动第一个元素

时间:2015-11-14 15:21:43

标签: python list slice

好的,我有一个列表,我想在列表的最后一个元素之前移动列表开头的元素数,其中最后一个元素表示我需要移动的元素数。 例如:[2, 19, 6, 26, 1, 15, 12, 3],由于最后一个元素是3,结果看起来像[26, 1, 15, 12, 2, 19, 6, 3]。有谁知道我怎么能用这种方式索引列表?

4 个答案:

答案 0 :(得分:3)

  • 要获取列表的最后一项,您可以使用-1索引(l[-1])。

  • 要获取列表的第一个n项,请从0切换到nl[0:n]); Python将省略初始0

  • 要将n中的元素添加到列表中的倒数第二个项目,请从n切换到-1l[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将意味着循环切片将增加列表添加重复元素的列表,您可能希望专门处理该情况。