我想制作一个列表的程序:
myList = [a,b,c]
并且能够向左或向右移动所有元素,并删除任何将被推出的元素,用0替换其他所有元素:
moveRight(mylist) = [0,a,b]
moveLeft(myList) = [b,c,0]
答案 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)。