web-dev-qa-db-ja.com

python list / setの最大長を設定する方法は?

C/c ++では、次のようになります。

maxnum = 10;
double xlist[maxnum];

python list/setの最大長を設定する方法は?

16
alvas

必要はありません。

Pythonリストは、コンテンツに合わせて必要に応じて動的に拡大および縮小します。セットはハッシュテーブルとして実装され、Python辞書のように、辞書はその内容に合わせて必要に応じて動的に拡大および縮小します。

おそらく、あなたが探していたのは _collections.deque_maxlenパラメータを取る)または heapq を使用して何か(heapq.heappushpop()(最大に達したとき)代わりに?

22
Martijn Pieters

これは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]
11
stalk

リストlstを取得すると、次のことができます

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

10要素を超えるサイズの場合、最初の10要素に切り捨てます。

7
kiriloff

できません。リストとセットは本質的に動的であり、任意のサイズに拡張できます。

Pythonはc ++ではありません、pythonは動的言語です。セットとリストは任意のサイズに拡張または縮小できます。

イテラブルからx個の最小または最大の項目が必要な場合は、 heapq モジュールを使用します。

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

Iterableで定義されたデータセットから最小のn個の要素を含むリストを返します。 keyは、指定されている場合、反復可能オブジェクトの各要素から比較キーを抽出するために使用される1つの引数の関数を指定します。

または bisect モジュールの場合があります:

このモジュールは、各挿入後にリストをソートする必要なく、ソートされた順序でリストを維持するためのサポートを提供します。

次に、スライスまたはitertools.sliceを使用して、リストから上位x項目を取得します。

3