python - 检查dict的任何值是否为None(没有迭代器)

时间:2015-08-30 12:32:25

标签: python dictionary nonetype

我想知道是否可以获得与此代码相同的输出:

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循环迭代器或生成器?

2 个答案:

答案 0 :(得分:10)

您可以使用

nones = not all(d.values())

如果所有值都不是None,则将nones设置为False,否则设置为True。它只是一个抽象,在内部它必须迭代值列表。

答案 1 :(得分:7)

你可以让Python使用ForeignKey在C代码中进行循环;这会对所有值进行成员资格测试而不创建新列表:

dict.values()

在Python 3中,>>> d = {'a': None, 'c': None, 'b': '12345'} >>> None not in d.viewvalues() False 也返回字典视图。

Python 2上的演示:

any()

这将遍历值,直到找到匹配,就像列表成员资格或正确的any()测试一样,使其成为O(N)测试。这不同于字典或集合成员资格测试,其中散列可用于平均为您提供固定成本测试。

你没有正确使用[...];删除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:

但是,这需要值可以清除。您现在可以简单地测试每个值:

use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;

在O(1)时间。