2011-12-13 27 views
4

可能性の重複:
How to make a python dictionary that returns key for keys missing from the dictionary instead of raising KeyError?Pythonのアイデンティティ辞書

私はdefaultdictようなものが必要。ただし、辞書にないキーについては、キー自体を返す必要があります。

これを行うにはどうすればよいですか?

+2

用語ニックネーム:アイデンティティdictは、通常、ハッシュではなくキーにオブジェクトアイデンティティ(id)を使用する辞書であると解釈されます。 – delnan

+0

ああ、私は他の質問を見つけられませんでした。それを指摘してくれてありがとう。 2つの質問を統合する方法はありますか?他の質問に対する受け入れられた答えは間違っていることが示され、OPは彼の受諾を変更することを煩わしませんでした。 – max

+0

@max:重複した質問を処理するためのスタックオーバーフロープロセスがあります。すべてが処理されます=) – katrielalex

答えて

11

魔法__missing__メソッドを使用します。あなたがサポートする必要があれば、この作品

>>> class KeyDict(dict): 
...  def __missing__(self, key): 
...    return key 
... 
>>> x = KeyDict() 
>>> x[2] 
2 
>>> x[2]=0 
>>> x[2] 
0 
>>> 
+0

ありがとうございました。 – max

8

あなたは次のような意味ですか?

value = dictionary.get(key, key) 
+0

+1行の解決策、クラスまたは上書きの必要はありません – juliomalegria

+1

'get 'アプローチの欠点は、あなたのコード全体に「見つからないときに戻るキー」ルールを複製することです。これがすべてのアクセスのルールであれば、コード全体で* k *回ではなく、コンテナ自体(@ katrielalexの '__missing__'回答を参照)にその_once_機能を実装することが最善です。 – Nathan

+0

残念ながら、私は辞書でなければならないことを指定しませんでした(辞書メソッドを呼び出すことが期待される関数に渡されます)。 – max

1
class Dict(dict): 
    def __getitem__(self, key): 
     try: 
      return super(Dict, self).__getitem__(key) 
     except KeyError: 
      return key 

>>> a = Dict() 
>>> a[1] 
1 
>>> a[1] = 'foo' 
>>> a[1] 
foo 

パイソン(@katrielalex言及__missing__方法を追加しました)< 2.5。