В c/С++ мы могли бы иметь:
maxnum = 10;
double xlist[maxnum];
Как установить максимальную длину для списка/набора python?
В c/С++ мы могли бы иметь:
maxnum = 10;
double xlist[maxnum];
Как установить максимальную длину для списка/набора python?
Вам не нужно и не нужно.
Списки Python растут и сжимаются динамически по мере необходимости, чтобы соответствовать их содержимому. Наборы реализуются как хеш-таблица, и, как и словари Python, растут и сжимаются динамически по мере необходимости, чтобы соответствовать их содержимому.
Возможно, вы искали collections.deque
(который принимает параметр maxlen
) или что-то с помощью heapq
(используя heapq.heappushpop()
, когда вы достигли максимума) вместо?
Вот расширенная версия 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 элементов, вы обрезаете первые десять элементов.
Вы не можете, списки и наборы являются динамическими по своей природе и могут вырасти до любого размера.
Python не С++, python - динамический язык. Наборы и список могут расширяться или уменьшаться до любого размера.
Используйте heapq, если вы хотите, чтобы x наименьших или самых больших элементов из итерируемого.
heapq.nsmallest(n, iterable[, key])
Возвращает список с n наименьшими элементами из набора данных, определенного итерация. key, если предусмотрено, задает функцию одного аргумента, которая используется для извлечения ключа сравнения из каждого элемента в итерабельном: key = str.lower Эквивалент: отсортирован (итерируемый, key = key) [: n]
Или может быть bisect модуль:
Этот модуль обеспечивает поддержку для ведения списка в отсортированном порядке без необходимости сортировать список после каждой вставки.
Затем используйте slicing или itertools.slice
, чтобы получить верхние элементы x из списка.