2012-01-28 18 views
10

私は通常、次のイディオムを使用します。辞書(Python)を更新せずにdefaultdictのキーをチェックする方法は? Pythonの辞書での作業時

try: 
    val = dct[key] 
except KeyError: 
    print key, " is not valid" 

大型の辞書のために、声明

if key in dct: 
    # do something 

は非常に効率的ではない(ので、私は読んで覚えているが、私はしましたので、

今日私はdefaultdictで作業していましたが、defaultdictはあなたにKeyErrorを与えることはありませんが、代わりに元の辞書を更新することを忘れてしまいました。

defaultdictを更新せずにルックアップを実行するにはどうすればよいですか?私は本当にユーザーがキーを再入力できるようにエラーを出力する必要があります。

ありがとうございました!

更新:投稿者の中には、if key in dct:が遅いという私の信念が間違っていることが示唆されています。私は戻って、私が読んだ本をチェックしました。それはtry: except:を使う方が良いです。 2002年のPython Cookbook、Alex Martelliのレシピ1.4です。オンラインでもご覧になれます:Add an entry to dictionary。古い記憶はとても信頼できません!レシピは「遅い」とは言及せず、inでもhas_keyを使用していません。それは単にtry: except:がPythonic(少なくともレシピの本版)であると言います。訂正と答えをありがとう。

+0

可能な重複http://stackoverflow.com/questions/1602934/what-is-a-good-way-to-test-if-a-key-exists-in-python-dictionary –

+1

重複ではありません。これは 'defaultdict'に関するものです。 –

+7

'key in d 'は遅くなく、ピリオドではありません。もしあなたがそうでなければ、あなたはしっかりとした証明を得るべきです。 'timeit'は成功した' d [key] 'と同じくらい速く、' d [key] '+' except:pass'よりもずっと速く(ほぼ10倍)もしキーがほぼ常に存在するならば)。さて、 'd.keys()'のキー(Python 2.x)や 'list in key '(d。keys()) '(Python 3.x)は遅いですが、意図的にハッシュテーブルの情報を捨ててしまうためです。 – delnan

答えて

17

defaultdictを更新せずにルックアップを実行するにはどうすればよいですか?

key in dctで明示的に指定します。

これがの場合、実際にはと高価すぎる(対策はありますが)、特定の状況の回避策があります。例えば、デフォルトの値は'ham'であり、あなたがkeyが見つからない場合、あなたは

dct.get(key, 'ham') # will return dct[key] or 'ham' but never stores anything 
+7

'has_key'は' key in dct'のために廃止されました。古いイディオムの使用を促進してはいけません。 – PaulMcG

8

key in dctを行うことができますdefaultdict(key, 'ham')を保存したくないいくつかの状況ではそれがあると言って、高速に動作するようにを持っている場合遅いというと、dct[key]が遅く、決してそうであってはいけません。そのキーが与えられている辞書から要素を取り出すことと、キーのメンバーシップをテストすることは、まともなディクショナリ実装ではO(1)操作でなければならず、メンバシップ操作をアクセス操作に関してどのように実装できるかを見るのは簡単です。

defaultdictでご質問の場合はinをご利用ください。そして、通常の辞書にinの使用を避ける理由はありません。