web-dev-qa-db-ja.com

python-dictの値がNoneではないかどうかを確認します(イテレータなし)

このコードと同じ出力を取得することは可能ですか?

d = {'a':None,'b':'12345','c':None}
nones=False
for k,v in d.items(): 
  if d[k] is None:
    nones=True      

または

any([v==None for v in d.values()])

しかし、forループイテレータ、またはジェネレータなしですか?

19
yourstruly

使用できます

nones = not all(d.values())

すべての値がNoneでない場合、nonesはFalseに設定され、それ以外の場合はTrueに設定されます。ただし、これは単なる抽象概念であり、内部的には値リストを反復処理する必要があります。

10
hspandher

Python dictionary view を使用してCコードでループを実行することができます。これにより、新しいリストを作成せずにすべての値に対してメンバーシップテストが実行されます。

_if None not in d.viewvalues():
_

Python 3の場合、dict.values()は辞書ビューも返します。

Python 2:のデモ:

_>>> d = {'a': None, 'c': None, 'b': '12345'}
>>> None not in d.viewvalues()
False
_

これは、リストメンバーシップまたは適切なany()テストと同様に、一致が見つかるまで値をループし、これをO(N)テストにします。これは、辞書またはセットメンバーシップテスト。ハッシュを使用して、平均して固定コストテストを行うことができます。

any()を適切に使用していませんでした。 _[...]_ブラケットを削除します。

_if any(v is not None for v in d.itervalues()):  # Python 3: use d.values()
_

特定の値およびをテストすることが目的の場合は、各テストで定数ループが発生しないようにする必要があるため、代わりに逆インデックスを作成することを検討してください。

_inverse_index = {}
for key, value in d.items():
    inverse.setdefault(value, set()).add(key)
_

ただし、これには値がハッシュ可能である必要があります。これで、各値を簡単にテストできます。

_if None not in inverse_index:
_

O(1)時間。

7
Martijn Pieters