Подтвердить что ты не робот

Как установить максимальную длину для списка/набора python?

В c/С++ мы могли бы иметь:

maxnum = 10;
double xlist[maxnum];

Как установить максимальную длину для списка/набора python?

4b9b3361

Ответ 1

Вам не нужно и не нужно.

Списки Python растут и сжимаются динамически по мере необходимости, чтобы соответствовать их содержимому. Наборы реализуются как хеш-таблица, и, как и словари Python, растут и сжимаются динамически по мере необходимости, чтобы соответствовать их содержимому.

Возможно, вы искали collections.deque (который принимает параметр maxlen) или что-то с помощью heapq (используя heapq.heappushpop(), когда вы достигли максимума) вместо?

Ответ 2

Вот расширенная версия 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]

Ответ 3

Как только у вас есть список, lst, вы можете

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

Если размер более 10 элементов, вы обрезаете первые десять элементов.

Ответ 4

Вы не можете, списки и наборы являются динамическими по своей природе и могут вырасти до любого размера.

Python не С++, python - динамический язык. Наборы и список могут расширяться или уменьшаться до любого размера.

Используйте heapq, если вы хотите, чтобы x наименьших или самых больших элементов из итерируемого.

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

Возвращает список с n наименьшими элементами из набора данных, определенного итерация. key, если предусмотрено, задает функцию одного аргумента, которая используется для извлечения ключа сравнения из каждого элемента в итерабельном: key = str.lower Эквивалент: отсортирован (итерируемый, key = key) [: n]

Или может быть bisect модуль:

Этот модуль обеспечивает поддержку для ведения списка в отсортированном порядке без необходимости сортировать список после каждой вставки.

Затем используйте slicing или itertools.slice, чтобы получить верхние элементы x из списка.