2017-04-13 56 views
2

我使用Python 3测试,如果一本字典的值是非零所有()函数

我要检查所有的嵌套字典我的测试值都是非0

所以在这里是简化的示例字典:

d = {'a': {'1990': 10, '1991': 0, '1992': 30}, 
    'b': {'1990': 15, '1991': 40, '1992': 0}} 

,我想测试,如果两种类型的字典“一”和“b”的密钥“1990”的值和“1991”不为零

for i in d: 
    for k in range(2): 
     year = 1990 
     year = year + k 
     if all((d[i][str(year)]) != 0): 
      print(d[i]) 

所以它应该只返回b,因为['1991'] = 0

但这是我第一次使用all()函数,我得到错误核心:TypeError:'bool'object是不是可迭代

错误是在如果所有()行

非常感谢你!

+0

的[如何Python的任何可能的复制和所有功能的工作?](http://stackoverflow.com/questions/19389490/how-do-pythons-any-and-all-functions-work) –

+0

在我发布我的问题之前,我看了这个线程,但它只是帮助了一个人。从理论上讲,所有功能都是我需要的正确操作符。但不知何故,我没有给所有函数迭代。但我认为通过运行for循环,我做 这是行不通的,以及: 'TR = ALL((d [I] [STR(年))!= 0) 如果TR: 打印( d [i])' – TDot

+0

然后你真正的问题是理解什么是可迭代的,以及如何传递它。 '(d [i] [str(year)])!= 0'是一个'bool',所以你需要传递一个列表到'all' –

回答

0

这可以通过列表理解来完成,在列表理解中您可以遍历字典d中的项目。一个简单的解析来遍历键和值在我们的字典是这样的:

>>> [k for k, v in d.items()] 
['a', 'b'] 

在上面k将包含键和v值。理解也有一个if子句。有了这个,你可以过滤出你不想要的物品。所以我们定义了years = ('1990', '1991')。现在我们可以通过另一种理解来测试我们的年度价值。

遍历只有 '一',我们可以这样做:

>>> [d['a'][y] for y in years] 
[10, 0] 
>>> all([d['a'][y] for y in years]) 
False 

胶合的整个事情:

>>> d={'a' :{ '1990': 10, '1991':0, '1992':30},'b':{ '1990':15, '1991':40, '1992':0}} 
>>> years = ('1990', '1991') 
>>> [k for k, v in d.items() if all([v[y] for y in years])] 
['b'] 

the python docs for more information on list comprehensions.

+0

谢谢!它在我更大的代码中工作。我肯定会学习python的很多东西。我花了一段时间才明白0是错误的,因此在你的代码中不需要参数 在我更大的代码中,我有更多的年份,那就是为什么我使用了范围函数。你是否仍然认为只是把它们写在一个列表中(或者像你这样的元组)是最好的? – TDot

+0

如果一组年份不会改变,那就很好。如果你想在数据结构中建立一整年的所有年份,你可以使用'set'对象和'itertools'包(标准库的一部分)中的'chain'方法它。链(* [d [di] .keys()for di] d))' –

+0

如果这解决了您的问题,请您接受答案? –

相关问题