12

ありますか\python の非常に便利なものと同等のものをどのように構築しますcollections.defaultdictか?

このようなコンテナの想像上の使用法:

>>> a = collections.defaultlist(0)
>>> a[2]=7
>>> a[4]='x'
>>> a
[0,0,7,0,'x']

更新:この構造にさらに機能を追加するために、フォローアップの質問を追加しまし

4

5 に答える 5

12

これは少し使いにくいと思います。ただし、これを行う方法についての私の最初の考えは次のとおりです。

class defaultlist(list):
    def __init__(self, fx):
        self._fx = fx

    def __setitem__(self, index, value):
        while len(self) <= index:
            self.append(self._fx())
        list.__setitem__(self, index, value)

これは、デフォルト値の呼び出し可能 (defaultdict の仕組みだと思います) を取ります。

私が実行すると:

a = defaultlist(int)
print a
a[2] = 7
a[4] = 'x'
print a

私は戻ってきます:

[]
[0, 0, 7, 0, 'x']
于 2012-01-03T23:08:03.373 に答える
4

必要なのはインデックス アクセスだけで、スライスや追加などではない場合は、単にdefaultdict.

(本当に perl / js セマンティクスが必要な場合は、 list__get__とをサブクラス化できます__set__)

于 2012-01-03T22:41:57.933 に答える
2

わたしの提案:

def xtend(f):
    def wrap(self, index, *args):
        if len(self) <= index:
            self.extend([self._gen()] * (index - len(self) + 1))
        return f(self, index, *args)
    return wrap

class defaultlist(list):
    def __init__(self, gen, lst = []):
        list.__init__(self, lst)
        self._gen = gen

    __setitem__ = xtend(list.__setitem__)
    __getitem__ = xtend(list.__getitem__)

結果:

>>> a = defaultlist(int, [1, 2, 3])
>>> a[10] = 'x'
>>> a[2] = 7
>>> print a
[1, 2, 7, 0, 0, 0, 0, 0, 0, 0, 'x']
于 2012-01-04T00:14:51.097 に答える
0

おそらく最も簡単な方法は、dict を使用することです。

>>> a = {}
>>> a[2] = 7
>>> a[4] = 'x'
>>> [a[i] if i in a else 0 for i in xrange(max(a) + 1)]
[0, 0, 7, 0, 'x']
于 2012-01-04T00:40:36.790 に答える