デフォルトでキーを返すように defaultdict を取得する方法はありますか? または、同等の動作を持つデータ構造ですか?つまり、 Dictionary を初期化した後d
、
>>> d['a'] = 1
>>> d['a']
1
>>> d['b']
'b'
>>> d['c']
'c'
デフォルトの辞書がパラメーターを取らない関数を取るのを見ただけなので、新しい種類の辞書を作成する以外に解決策があるかどうかはわかりません。
デフォルトでキーを返すように defaultdict を取得する方法はありますか? または、同等の動作を持つデータ構造ですか?つまり、 Dictionary を初期化した後d
、
>>> d['a'] = 1
>>> d['a']
1
>>> d['b']
'b'
>>> d['c']
'c'
デフォルトの辞書がパラメーターを取らない関数を取るのを見ただけなので、新しい種類の辞書を作成する以外に解決策があるかどうかはわかりません。
__missing__
次のメソッドをオーバーライドしますdict
。
>>> class MyDefaultDict(dict):
... def __missing__(self, key):
... self[key] = key
... return key
...
>>> d = MyDefaultDict()
>>> d['joe']
'joe'
>>> d
{'joe': 'joe'}
編集: おっと、私のファイルのコードは元々別のスタックオーバーフローの答えから来ていることに気づきました!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
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)
メソッドを継承する (または類似する) 独自のクラスを作成し、メソッドdefaultdict
をオーバーライドする必要があります。__getitem__