16

collections.defaultdict素晴らしいです。特に次の場合lambda:

>>> import collections
>>> a = collections.defaultdict(lambda : [None,None])
>>> a['foo']
[None, None]

指定されたキー (例: 'foo') をラムダで使用する方法はありますか? 例(機能しません):

>>> a = collections.defaultdict(lambda : [None]*key)
>>> a[1]
[None]
>>> a[2]
[None, None]
>>> a
defaultdict(<function <lambda> at 0x02984170>, {1: [None], 2: [None, None]})
4

3 に答える 3

32

dict に存在しないアイテムにアクセスしようとするたびに__missing__、どちらが呼び出されるかが必要になるでしょう。dictバニラ__missing__は例外を発生させますが、サブクラスで好きなことをすることができます:

class A(dict):
    def __missing__(self, key):
        value = self[key] = [None] * key
        return value
于 2011-11-01T12:10:44.067 に答える
1

これは要求どおりに機能しますが、おそらく最善の解決策ではありません(デフォルトの呼び出しで初期化してから使用しない必要があります)。おそらく、他のメソッドをオーバーライドすることで修正できます。

class NoneDict(collections.defaultdict):
    def __setitem__(self, key, value):
        super(NoneDict, self).__setitem__(key, key*[None])
于 2011-11-01T08:10:48.897 に答える