python列表有固定大小吗,Python,强制列表固定大小

在Python(3)中,我想创建一个列表,其中包含输入的最后5个变量。

这是一个例子:

>>>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中,有没有办法实现上面演示的内容? 变量不需要是一个列表,我只是用它作为例子。

谢谢!

您可能希望使用具有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

+1,很好 - 我打算建议子类化列表ala gnibbler,但我怀疑可能有一个预先构建的解决方案。

python如何实现解决方案?添加新元素时,deque是否会弹出左侧元素?

Python有很多列表数据结构,可以在需要时使用list()转换为列表。例如,制作一个dict并试用列表(MyDict)。

@xiao它是一个双端队列,这意味着你可以有效地添加到任何一端。事实上,有一种附加方法可以附加到双端队列的前面。如果存在maxlen并且append / appendleft将结束,则从另一端移除一个项目。

有没有办法轻松删除结果列表中的'deque'和'maxlen = 5',以便只打印值列表?

print(list(l))将只打印内容

你可以继承list

>>> 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']

>>>

您还需要扩展insert,extend和setitem方法(l[1:1] = range(100))以使其变得简单。

考虑del self[0]。

并且可能还需要覆盖__add__

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

简单的解决方案:

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提示

不需要类功能或双端功能。

进一步......左右追加:

l = []

l.insert(0, x)                      # l.appendleft(x)

l = l[-5:]                          # maxlen=5

如果你想在不使用deque的情况下预先加载你的列表,那将是你的appendleft()等价物

最后,如果你选择从左边追加......

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的建议,我整理了一个完整的list子类。

但是,它被设计为仅从右向左"滚动"。例如,"完整"列表中的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()

你可以在PyMongo中使用一个上限集合 - 这太过分了,但它可以很好地完成工作:

import pymongo

#create collection

db.createCollection("my_capped_list",{capped:True, max:5})

#do inserts ...

#Read list

l = list(db.my_capped_list.find())

因此,只要您调用my_capped_list,就会检索插入的最后5个元素。

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

>>> 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

我不能使用返回列表的一部分的函数的原因是因为列表随着时间的推移变得非常大,并且它将保留许多永远不会再次使用的无用数据。

这可以再次由功能控制。如果它变大,就会在开始时脱掉那些。

insert()中的return是没有意义的,因为list.insert旨在就地操作。

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

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))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值