2016-12-02 9 views
3

関数collections.defaultdictは、のラムダ関数で定義できるデフォルト値を返します。キーが辞書にない場合。defaultdictで使用するキー値を返すラムダ関数

は今、私はそのキーが存在しない場合は未修正のキーと値を返すために、私のdefaultdictを願っています。 X: はこのように、私はラムダ恒等関数ラムダXを使用しています。私は、defaultdictがキーを返すと期待しています。しかし

>>>translation=defaultdict(lambda x:x) 
>>>translation['Haus']='maison' 
>>>translation['computer']='ordinateur' 
>>>translation['computer'] 
'ordinateur' 

、私はこれまで不在のキーと私のdefaultdictを提示:

>>>translation['email'] 

私はdefaultdictの翻訳は '電子メール' を返すことを期待しています。しかし、Python 2.7と言う:

TypeError: <lambda>() takes exactly 1 argument (0 given) 

確かに私は何か愚かなことをしています。しかし何?

+0

[KeyErrorを生成するのではなく、辞書にないキーのキーを返すPython辞書の作成方法](http://stackoverflow.com/questions/6229073/how-to-make-a- python-辞書-その-リターン・キーのための-欠落-から-dictiキー) –

答えて

4

残念ながら、デフォルトの辞書で使用される行方不明のキーを定義するためのファクトリ関数は引数を取りません - つまり、明白であるように見えるだろうかとは違って、それが実際の不足しているキーが渡されていません。

したがって、あなたが試されたキーは、このメソッドを使用しているかを知ることはできません。

代替は、(代わりにDefaultDictを使用しての)dict自分をサブクラス化することであり、__missing__メソッドを追加:1はunexistingキーを取得しようとするたびにそれが呼び出され、その後、受信した鍵を返却するのは自由です。

In [86]: class MyDict(dict): 
    ...:  __missing__ = lambda self, key: key 
    ...:  

In [87]: m = MyDict() 

In [88]: m["apples"] 
Out[88]: 'apples' 
+0

感謝。治療をします。実際には、ラムダ関数がキーを入力として渡さないというやや直観に反します。 – sixdiamants

+0

この*は素晴らしいですが、悲しいことに、標準の 'defaultdict'タイプの無駄を強調しています。 Python 4.xがこれらの問題を解決するかもしれません! –

関連する問題