在 C/C++ 中,我们可以有:
maxnum = 10;
double xlist[maxnum];
如何为Python列表/集合设置最大长度?
你不需要这样做。
Python列表会根据需要动态增长和缩小以适应其内容。集合被实现为哈希表,就像Python字典一样,会根据需要动态增长和缩小以适应其内容。
也许你正在寻找 collections.deque
(它使用 maxlen
参数),或者使用 heapq
的一些东西(在达到最大值时使用 heapq.heappushpop()
)?
sys.getsizeof
告诉我它占用了148个字节。在添加一百万个条目之后,它占用了25165876个字节。在弹出所有条目后,它仍然是25165876个字节。此外,如果我尝试 next(iter(d))
,在添加了一百万个条目后,速度比仅剩一个条目时快了约3500倍(这实际上是我注意到这一点的原因)。 - Stefan Pochmanndictresize
的位置。 - Martijn Pietersdeque
可以给你一个有限大小和插入时过期的队列,但你会失去索引访问。我没有看到任何原生队列支持索引访问或列表支持在最大大小时过期。 - stoooops这里是Python的list
的扩展版本。它的行为类似于list
,但如果长度超出限制,会引发BoundExceedError
错误(在Python 2.7中尝试):
class BoundExceedError(Exception):
pass
class BoundList(list):
def __init__(self, *args, **kwargs):
self.length = kwargs.pop('length', None)
super(BoundList, self).__init__(*args, **kwargs)
def _check_item_bound(self):
if self.length and len(self) >= self.length:
raise BoundExceedError()
def _check_list_bound(self, L):
if self.length and len(self) + len(L) > self.length:
raise BoundExceedError()
def append(self, x):
self._check_item_bound()
return super(BoundList, self).append(x)
def extend(self, L):
self._check_list_bound(L)
return super(BoundList, self).extend(L)
def insert(self, i, x):
self._check_item_bound()
return super(BoundList, self).insert(i, x)
def __add__(self, L):
self._check_list_bound(L)
return super(BoundList, self).__add__(L)
def __iadd__(self, L):
self._check_list_bound(L)
return super(BoundList, self).__iadd__(L)
def __setslice__(self, *args, **kwargs):
if len(args) > 2 and self.length:
left, right, L = args[0], args[1], args[2]
if right > self.length:
if left + len(L) > self.length:
raise BoundExceedError()
else:
len_del = (right - left)
len_add = len(L)
if len(self) - len_del + len_add > self.length:
raise BoundExceedError()
return super(BoundList, self).__setslice__(*args, **kwargs)
使用方法:
>>> l = BoundList(length=10)
>>> l.extend([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
>>> l
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> # now all these attempts will raise BoundExceedError:
>>> l.append(11)
>>> l.insert(0, 11)
>>> l.extend([11])
>>> l += [11]
>>> l + [11]
>>> l[len(l):] = [11]
一旦你拥有了列表lst
,你就可以
if len(lst)>10:
lst = lst[:10]
如果大小超过10个元素,则将其截断为前10个元素。
len(lst)
是多余的。 - alvasx=[1,2,6]; x = x[:2] if len(x)>2 else x
,然后再尝试运行这段代码 x=[1,2,6]; x[:2]
。 - alvasheapq.nsmallest(n, iterable[, key])
从可迭代对象中定义的数据集返回包含 n 个最小元素的列表。如果提供了 key,则指定一个带有一个参数的函数,用于从可迭代对象中的每个元素提取比较键:key=str.lower 等效于:sorted(iterable, key=key)[:n]
或者也可以使用 bisect 模块:
该模块提供了维护已排序列表的支持,而无需在每次插入后对列表进行排序。
然后使用切片或 itertools.slice
从列表中获取前 x 个项目。
你可以使用先分配内存的解决方案
[0] * maxnum
或者
[a sample of your object] * maxnum
list
的功能。然后在add
(和可能的其他)方法中添加最大长度检查。 - stalk