2013-04-14 7 views
13

私はnameamountが存在するかどうかをテストしたいので、私はpython:辞書に複数のキーが存在するかどうかを確認する最も良い方法は何ですか?

if not `name` in d and not `amount` in d: 
    raise ValueError # for example 

私はAPIからデータを取得し、私は10のかどうかをテストしたいとし尽くします

d = { 
    'name': 'name', 
    'date': 'date', 
    'amount': 'amount', 
    ... 
} 

ように私の辞書には見えますフィールドが辞書に存在するかどうか。

まだ最適な方法はありますか?

答えて

28

あなたはset交差点使用することができます:Pythonの3では

if not d.viewkeys() & {'amount', 'name'}: 
    raise ValueError 

を、それがあることと思います:dictのビューを返します

if not d.keys() & {'amount', 'name'}: 
    raise ValueError 

.keys()ので、 〜によって失敗。 .viewkeys()(そしてPython 3では.keys())によって返されたようなDictionary view objectsは、セットと交差テストが非常に効率的です。 Pythonの2.7で

デモ:これは、両方のキーが欠落しているだけ場合、Trueをテストすることを

>>> d = { 
... 'name': 'name', 
... 'date': 'date', 
... 'amount': 'amount', 
... } 
>>> not d.viewkeys() & {'amount', 'name'} 
False 
>>> del d['name'] 
>>> not d.viewkeys() & {'amount', 'name'} 
False 
>>> del d['amount'] 
>>> not d.viewkeys() & {'amount', 'name'} 
True 

注意。

Falseで
if not d.viewkeys() >= {'amount', 'name'}: 
    raise ValueError 

両方キーが存在しているだけ場合:

>>> d = { 
... 'name': 'name', 
... 'date': 'date', 
... 'amount': 'amount', 
... } 
>>> not d.viewkeys() >= {'amount', 'name'} 
False 
>>> del d['amount'] 
>>> not d.viewkeys() >= {'amount', 'name'}) 
True 

厳しい比較のために(可能あなたはどちらかが欠落している、使用された場合に合格するためにテストが必要な場合のみ 2つのキー、それ以上はない)、Python 2では、辞書のビューとセットを比較する:

if d.viewkeys() != {'amount', 'name'}: 
    raise ValueError 

(したがって、Python 3ではif d.keys() != {'amount', 'name'}となります)。

+0

私はちょっと混乱していますが、 '{'amount'、 'name'}'が両方とも 'd 'に存在するかどうかをテストするにはどうすればいいですか? – daydreamer

+0

@daydreamer: 'd.viewkeys()> = {'amount'、 'name'}'両方のキーが存在する場合は 'True'です。 –

+0

私は厳密な比較が必要なので、私は '>>> dと信じています。viewkeys()== {'name'、 'amount'、 'date'} True'は十分ですが、どう思いますか? – daydreamer

9
if all(k not in d for k in ('name', 'amount')): 
    raise ValueError 

または

if all(k in d for k in ('name', 'amount')): 
    # do stuff 
+0

>>> d = { ... 'name': 'name', ... 'date': 'date', ... 'amount': 'amount' ... } >>> tests={'name','date'} >>> if any(test not in d for test in tests): ... raise ValueError >>> # no error... >>> del d['name'] >>> if any(test not in d for test in tests): ... raise ValueError ... Traceback (most recent call last): File "<stdin>", line 2, in <module> ValueError 

作品を読んで、すべてのPythonのバージョンと互換性が交差する方が簡単。 +1。 – darksky

3

あなたはまた、のように設定使用することができます:私はこのフォームを好き

>>> d = { 
    'name': 'name', 
    'date': 'date', 
    'amount': 'amount', 
} 
>>> test = set(['name','date']) 
>>> test.issubset(set(d.keys())) 
True 
+1

'set'メソッドを使用している場合、引数を' set'に変換する必要はありません。 'test.issubset(d.keys())'は正常に動作します。これをさらに単純化し、 'test.issubset(d)'を実行することもできます。Pythonでは 'test' <=' d.viewkeys() '(または' d.keys() ')を実行することもできます。私が票を使い果たしていないなら、これを+1します。 – jamylak

+0

はい、そうです。あなたの提案をありがとう! – Sheng

0

:Pyの2またはPyの3

関連する問題