2017-01-05 64 views
2

所以我有一個字典充滿了大量有用的東西。如果列表中的任何值爲空,我想刪除一個鍵(不帶鍵的話建立一個新的字典)。Python3刪除字典鍵如果列表中的值爲空

字典:

>>>print(vaar123) 
{'moo': 'cora', 'ham': ['', 'test'], 'bye': 2, 'pigeon': '', 'heloo': 1} 

我可以刪除其沿東西線空值的「鴿子」的關鍵。

>>>dict((k, v) for k, v in vaar123.items() if v) 
{'moo': 'cora', 'ham': ['', 'test'], 'heloo': 1, 'bye': 2} 

但是儘量爲我可能,我似乎無法想出一個方法來刪除「火腿」,因爲它的列表中包含空值。

在此先感謝您的任何建議, 弗蘭克

信息:這本字典是建立與上建立一個值(由管理員設置),附加價值被添加到列表中的用戶輸入。值對用作輸出。在列表中有單個值會產生不希望的輸出。

回答

1

此功能遞歸檢查SizedIterable s到看他們是否是空的,返回False如果它發現一個是

from collections.abc import Sized, Iterable #If you're on Python >= 3.6, 
              #you can use collections.abc.Collection 

def all_nonempty(v): 
    if isinstance(v, (Sized, Iterable)): 
     return v and (all(map(all_nonempty, v)) if not isinstance(v, str) else True) 
     #We do the check against str because 'a' is a sized iterable that 
     #contains 'a'. I don't think there's an abstract class for 
     #containers like that 
    return True 

然後我們就可以用這個方法來篩選的字典

print({k: v for k, v in d.items() if all_nonempty(v)}) 

輸出:

{'moo': 'cora', 'bye': 2, 'heloo': 1} 
+0

謝謝你的這種做法,創造奇蹟。 –

0

也許是這樣的:

>>> d = {'moo': 'cora', 'ham': ['', 'test'], 'heloo': 1, 'bye': 2} 
>>> {k:v for k,v in d.items() if not(isinstance(v,list) and len(v) > 0 and v[0] == '')} 
{'heloo': 1, 'moo': 'cora', 'bye': 2} 

或者,也許只是:

>>> {k:v for k,v in d.items() if not(isinstance(v,list) and '' in v)} 
{'heloo': 1, 'moo': 'cora', 'bye': 2} 

第一個答案將刪除其中的值列表,其中第一元素是''項目。第二個將刪除任何值,其中''發生在某個列表中。

0

假設列表中的所有值都是字符串:

{k: v 
for k, v in vaar123.items() 
if (not hasattr(v, '__iter__')) or 
    (hasattr(v, '__iter__') and v and all(elem for elem in v))} 

說明:保留不可迭代的值,因爲它們不能爲空(沒有意義)。否則,如果一個值是可迭代的,如果它是空的或者它包含任何假值(即上面假設的空字符串),則丟棄它。

相關問題