18

私の口述は次のようになります

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

nameandamountが存在するかどうかをテストしたいので、実行します

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

APIからデータを取得し10、フィールドが辞書に存在するかどうかをテストしたいとします。

それはまだ探すのに最適な方法ですか?

4

5 に答える 5

44

set交差点を使用できます:

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

Python 3 では、次のようになります。

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

.keys()デフォルトでdictビューを返すためです。によって(およびPython 3 で)返されるようなディクショナリ ビュー オブジェクトはセットとして機能し、交差テストは非常に効率的です。.viewkeys().keys()

Python 2.7 でのデモ:

>>> 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

これは、両方のキーが欠落している場合にのみ True をテストすることに注意してください。どちらかが欠落している場合にテストに合格する必要がある場合は、次を使用します。

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

これは、両方のキーが存在する場合にのみ False になります。

>>> 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'})。

于 2013-04-14T21:36:48.403 に答える
11
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
于 2013-04-14T21:35:47.910 に答える