21

デフォルトでキーを返すように defaultdict を取得する方法はありますか? または、同等の動作を持つデータ構造ですか?つまり、 Dictionary を初期化した後d

>>> d['a'] = 1
>>> d['a']
1
>>> d['b']
'b'
>>> d['c']
'c'

デフォルトの辞書がパラメーターを取らない関数を取るのを見ただけなので、新しい種類の辞書を作成する以外に解決策があるかどうかはわかりません。

4

4 に答える 4

25

__missing__次のメソッドをオーバーライドしますdict

>>> class MyDefaultDict(dict):
...     def __missing__(self, key):
...         self[key] = key
...         return key
...
>>> d = MyDefaultDict()
>>> d['joe']
'joe'
>>> d
{'joe': 'joe'}
于 2012-05-29T00:28:39.790 に答える
7

編集: おっと、私のファイルのコードは元々別のスタックオーバーフローの答えから来ていることに気づきました!https://stackoverflow.com/a/2912455/456876、それを賛成してください。

これは私が使用しているものです-これは、引数なしではなく、initへの引数として渡されるdefault-valueファクトリ関数に引数としてキーを渡すdefaultdictバリアントです。

class keybased_defaultdict(defaultdict):
    def __missing__(self, key):
        if self.default_factory is None:
            raise KeyError(key)
        else:
            value = self[key] = self.default_factory(key)
            return value

これはあなたが望む使用法です:

>>> d = keybased_defaultdict(lambda x: x)
>>> d[1]
1
>>> d['a']
'a'

その他の可能性:

>>> d = keybased_defaultdict(lambda x: len(x))
>>> d['a']
1
>>> d['abc']
3
于 2012-05-29T00:36:54.487 に答える
4

dictをサブクラス化したくない場合は、

d.get('a', 'a')
d.get('b', 'b')
d.get('c', 'c')

この目的のためには、どちらがより明確で魔法が少ないと思います

あなたがDRY狂信者であり、単一のcharキーしかない場合は、これを行うことができます:)

d.get(*'a'*2)
d.get(*'b'*2)
d.get(*'c'*2)
于 2012-05-29T00:59:32.027 に答える
3

メソッドを継承する (または類似する) 独自のクラスを作成し、メソッドdefaultdictをオーバーライドする必要があります。__getitem__

于 2012-05-29T00:27:30.973 に答える