web-dev-qa-db-fra.com

Comment définir une longueur maximale pour une liste / ensemble python?

En c/c ++, on pourrait avoir:

maxnum = 10;
double xlist[maxnum];

Comment définir une longueur maximale pour une liste/ensemble python?

16
alvas

Vous n'en avez pas besoin et n'en avez pas besoin.

Les listes Python grandissent et rétrécissent dynamiquement selon les besoins pour s'adapter à leur contenu. Les ensembles sont implémentés comme une table de hachage, et comme Python grandissent et rétrécissent dynamiquement selon les besoins pour s'adapter à leur contenu.

Peut-être que vous cherchiez collections.deque (qui prend un paramètre maxlen) ou quelque chose utilisant heapq (en utilisant heapq.heappushpop() lorsque vous avez atteint le maximum) à la place?

22
Martijn Pieters

Voici la version étendue de list de python. Il se comporte comme list, mais augmentera BoundExceedError, si la longueur est dépassée (essayé dans 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)

tilisation:

>>> 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]
11
stalk

Une fois que vous avez votre liste, lst, vous pouvez

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

Si la taille dépasse 10 éléments, vous tronquez les dix premiers éléments.

7
kiriloff

Vous ne pouvez pas, les listes et les ensembles sont de nature dynamique et peuvent atteindre n'importe quelle taille.

Python n'est pas c ++, python est un langage dynamique. Les ensembles et la liste peuvent se développer ou se réduire à n'importe quelle taille.

Utilisez le module heapq si vous voulez x les éléments les plus petits ou les plus grands d'un itérable.

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

Renvoie une liste avec les n plus petits éléments de l'ensemble de données défini par itérable. La clé, si elle est fournie, spécifie la fonction d'un argument utilisé pour extraire une clé de comparaison de chaque élément de l'itérable: clé = str.lower Équivalent à: trié (itérable, clé = clé) [: n]

Ou peut être bissect module:

Ce module prend en charge le maintien d'une liste dans un ordre trié sans avoir à trier la liste après chaque insertion.

Utilisez ensuite le découpage ou itertools.slice pour obtenir les x premiers éléments de la liste.

3
Ashwini Chaudhary