このコードと同じ出力を取得することは可能ですか?
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ループイテレータ、またはジェネレータなしですか?
使用できます
nones = not all(d.values())
すべての値がNoneでない場合、nonesはFalseに設定され、それ以外の場合はTrueに設定されます。ただし、これは単なる抽象概念であり、内部的には値リストを反復処理する必要があります。
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)時間。