Python,强迫一个列表固定的大小

在Python(3)我想创build一个列表,将包含最后5个variablesinput到它。 这里是一个例子:

>>>l = [] >>>l.append('apple') >>>l.append('orange') >>>l.append('grape') >>>l.append('banana') >>>l.append('mango') >>>print(l) ['apple','orange','grape','banana','mango'] >>>l.append('kiwi') >>>print(l) ['orange','grape','banana','mango','kiwi'] #only 5 items in list 

那么,在python中,有什么办法可以实现上面的演示呢? 该variables不需要是一个列表,我只是用它作为例子。

谢谢!

您可能想使用带有maxlen构造函数参数的collections.deque对象:

 >>>l = collections.deque(maxlen=5) >>>l.append('apple') >>>l.append('orange') >>>l.append('grape') >>>l.append('banana') >>>l.append('mango') >>>print(l) deque(['apple','orange','grape','banana','mango'], maxlen=5) >>>l.append('kiwi') >>>print(l) deque(['orange','grape','banana','mango','kiwi'], maxlen=5) #only 5 items in list 

你可以inheritancelist

 >>> class L(list): ... def append(self, item): ... list.append(self, item) ... if len(self) > 5: self[:1]=[] ... >>> l = L() >>> l.append('apple') >>> l.append('orange') >>> l.append('grape') >>> l.append('banana') >>> l.append('mango') >>> print(l) ['apple', 'orange', 'grape', 'banana', 'mango'] >>> l.append('kiwi') >>> print(l) ['orange', 'grape', 'banana', 'mango', 'kiwi'] >>> 

我遇到了同样的问题…从deque maxlen = 5是不支持的选项,由于访问速度/可靠性问题。

简单的解决scheme:

 l = [] l.append(x) # add 'x' to right side of list l = l[-5:] # maxlen=5 

附加之后,只需将'l'重新定义为'l'的最近五个元素即可。

 print(l) 

把它叫做完成。

为了你的目的,你可以在那里停下来…但是我需要一个popleft()。 而pop()从右侧删除一个项目,它刚刚追加了… pop(0)从左侧删除它:

 if len(l) == 5: # if the length of list 'l' has reached 5 right_in_left_out = l.pop(0) # l.popleft() else: # right_in_left_out = None # return 'None' if not fully populated 

在Tradewave.net上给James的提示

不需要类的function或双向。

进一步…追加左边和右边popup:

 l = [] l.insert(0, x) # l.appendleft(x) l = l[-5:] # maxlen=5 

将您的appendleft()等效,如果你想前加载你的列表,而不使用双转子

最后,如果你select从左边追加…

 if len(l) == 5: # if the length of list 'l' has reached 5 left_in_right_out = l.pop() # pop() from right side else: # left_in_right_out = None # return 'None' if not fully populated 

deque随机访问速度慢,不支持切片。 根据gnibbler的build议,我把一个完整的list子类放在一起。

但是,它的devise目的只是从右到左“滚动”。 例如,在“完整”列表中insert()将不起作用。

 class LimitedList(list): # Read-only @property def maxLen(self): return self._maxLen def __init__(self, *args, **kwargs): self._maxLen = kwargs.pop("maxLen") list.__init__(self, *args, **kwargs) def _truncate(self): """Called by various methods to reinforce the maximum length.""" dif = len(self)-self._maxLen if dif > 0: self[:dif]=[] def append(self, x): list.append(self, x) self._truncate() def insert(self, *args): list.insert(self, *args) self._truncate() def extend(self, x): list.extend(self, x) self._truncate() def __setitem__(self, *args): list.__setitem__(self, *args) self._truncate() def __setslice__(self, *args): list.__setslice__(self, *args) self._truncate() 

大多数情况下,当你需要这样一种设施时,你可以编写一个函数来获取列表,然后返回最后五个元素。

 >>> l = range(10) >>> l[-5:] 

但是,如果你真的想要一个自定义列表,对五个元素有一个上限,你可以重写内置列表和它的方法,你可以做这样的事情,所有的方法。

 class fivelist(list): def __init__(self, items): list.__init__(self, items[-5:]) def insert(self, i, x): list.insert(self, i, x) return self[-5:] def __getitem__(self, i): if i > 4: raise IndexError return list.__getitem__(self, i) def __setitem__(self, i, x): if 0<= i <= 4: return list.__setitem__(self, i, x) else: raise IndexError 

它可以像下面的解决scheme一样简单

 lst = [] arr_size = int(input("Enter the array size ")) while len(lst) != arr_size: arr_elem= int(input("Enter the array element ")) lst.append(arr_elem) sum_of_elements = sum(lst) print("Sum is {0}".format(sum_of_elements))