如何设置python列表/集的最大长度?

时间:2013-07-08 12:30:45

标签: python list max maxlength

在c / c ++中,我们可以:

maxnum = 10;
double xlist[maxnum];

如何设置python列表/集的最大长度?

4 个答案:

答案 0 :(得分:21)

你不需要也不需要。

Python列表根据需要动态增长和缩小以适应其内容。集合实现为哈希表,并且像Python字典一样根据需要动态增长和缩小以适应其内容。

也许您正在寻找collections.deque(需要maxlen参数)或使用heapq(当您达到最大值时使用heapq.heappushpop())代替?< / p>

答案 1 :(得分:11)

这是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]

答案 2 :(得分:7)

获得列表lst后,您可以

if len(lst)>10:
    lst = lst[:10]

如果大小超过10个元素,则截断为前十个元素。

答案 3 :(得分:3)

你不能,列表和集合本质上是动态的,可以增长到任何大小。

Python不是c ++,python是一种动态语言。集和列表可以扩展或缩小到任何大小。

如果您想要可迭代的x个最小或最大项目,请使用heapq模块。

heapq.nsmallest(n, iterable[, key])
  

返回一个列表,其中包含由定义的数据集中的n个最小元素   迭代。 key,如果提供,则指定一个参数的函数   用于从iterable中的每个元素中提取比较键:   key = str.lower相当于:sorted(iterable,key = key)[:n]

或者可能是bisect模块:

  

此模块支持按排序顺序维护列表   无需在每次插入后对列表进行排序。

然后使用切片或itertools.slice从列表中获取前x个项目。