ありますか\python の非常に便利なものと同等のものをどのように構築しますcollections.defaultdict
か?
このようなコンテナの想像上の使用法:
>>> a = collections.defaultlist(0)
>>> a[2]=7
>>> a[4]='x'
>>> a
[0,0,7,0,'x']
更新:この構造にさらに機能を追加するために、フォローアップの質問を追加しました
ありますか\python の非常に便利なものと同等のものをどのように構築しますcollections.defaultdict
か?
このようなコンテナの想像上の使用法:
>>> a = collections.defaultlist(0)
>>> a[2]=7
>>> a[4]='x'
>>> a
[0,0,7,0,'x']
更新:この構造にさらに機能を追加するために、フォローアップの質問を追加しました
これは少し使いにくいと思います。ただし、これを行う方法についての私の最初の考えは次のとおりです。
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']
必要なのはインデックス アクセスだけで、スライスや追加などではない場合は、単にdefaultdict
.
(本当に perl / js セマンティクスが必要な場合は、 list__get__
とをサブクラス化できます__set__
)
わたしの提案:
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']
おそらく最も簡単な方法は、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']