6

辞書から値を取得できる簡単な方法を探しています。辞書がない場合は、ユーザーが渡したキーを返します。

例えば:

>>> lookup = defaultdict(magic)
>>> print lookup['DNE']
'DNE'
>>> print lookup.get('DNE')
'DNE'
>>> print lookup['exists']
'some other value'
>>> print lookup.get('exists')
'some other value'

これらは常に文字列になりますが、基本的に私は言語マップを作成しており、値を取得する簡単な方法が必要です。値が存在する場合はそれを返し、そうでない場合はキーを返します。

これを行う簡単な方法はありますか?または、dictを拡張して手動で実行する必要があります。

4

3 に答える 3

17

defaultdictデフォルト値を生成する関数は、要求されたキーにアクセスできないため、ここでは役に立たないと思います。

ただし、通常の辞書を使用getし、デフォルト値で使用します。

>>> lookup = {}
>>> key = 'DNE'
>>> lookup.get(key, key)
'DNE'
于 2012-05-09T21:13:58.127 に答える
5

ラムダ関数で可能なはずです

from collections import defaultdict
a = defaultdict((lambda : 'DNE'))

編集:申し訳ありませんが、質問を読み違えました。上記のコメントがすでに述べたように。進むべき道は、dict クラスを拡張することです。

>>> class mydict(dict):
...     def __missing__(self,key):
...         return key
... 
>>> a = mydict()
>>> a['asd']
'asd'
于 2012-05-09T21:22:03.107 に答える
2

これは少なくともPython2.7で機能します。

from collections import defaultdict

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

lookup = KeyAwareDefaultDict((lambda key: key))

標準のdictとは異なり、defaultdict.get()も__missing__を呼び出すように見えるため、拡張のより良いベースになります。

于 2012-05-10T05:33:24.913 に答える