如何在Python中向左或向右移动列表中的所有元素?

时间:2016-03-12 18:19:57

标签: python list

我想制作一个列表的程序:

myList = [a,b,c]

并且能够向左或向右移动所有元素,并删除任何将被推出的元素,用0替换其他所有元素:

moveRight(mylist) = [0,a,b]
moveLeft(myList) = [b,c,0]

4 个答案:

答案 0 :(得分:3)

切片非常有用:

def moveRight(mylist, distance=1, pad=0):
    return ([pad] * distance) + mylist[:0 - distance]

def moveLeft(mylist, distance=1, pad=0):
    return mylist[distance:] + ([pad] * distance)

您也可以就地进行更改:

def moveRight(mylist, distance=1, pad=0):
    mylist[:] = ([pad] * distance) + mylist[:0 - distance]

def moveLeft(mylist, distance=1, pad=0):
    mylist[:] = mylist[distance:] + ([pad] * distance)

两种方式,默认是移1,但你可以移动任何正整数。您还可以使用0以外的其他内容填充缺少的元素。

答案 1 :(得分:3)

您可以对列表进行切片以删除相关元素并向其添加[0]

def moveRight(mylist):
    return ['0'] + myList[:-1]

def moveLeft(mylist):
    return myList[1:] + ['0']

答案 2 :(得分:1)

如果您希望保留集合的大小,请使用集合模块中的deque

from collections import deque

>>> d = deque(list(range(1, 6)), maxlen=5)
>>> d.append(0)
>>> d
deque([2, 3, 4, 5, 0], maxlen=5)
>>> d.appendleft(0)
>>> d
deque([0, 2, 3, 4, 5], maxlen=5)

deque还有extend和extendleft方法,可以一次添加多个元素。

答案 3 :(得分:1)

在您的案例中,您还可以充分利用collections模块中的deque

>>> from collections import deque
>>> 
>>> q = deque(maxlen=3)
>>>
>>> q.extend(['a','b','c'])
>>> 
>>> q
deque(['a', 'b', 'c'], maxlen=3)
>>> q.appendleft(0)
>>> q
deque([0, 'a', 'b'], maxlen=3)
>>> q.append(0)
>>> q
deque(['a', 'b', 0], maxlen=3)

这里的想法是保持固定大小的queue,因此无论何时从右侧或左侧追加项目,对方的项目都会被推出。

引自Python Cookbook 3rd Edition

  

从队列的任何一端添加或弹出项目都有O(1)   复杂。这与插入或删除项目的列表不同   从列表的前面是O(N)。