2017-04-13 57 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

如果這解決了您的問題,請您接受答案? –

相關問題