2011-06-10 35 views
7

如果我有一本词典,并且我想删除其中的值为空列表的条目[]我该如何去做这件事?删除没有值的dictonary条目 - Python

我想:

for x in dict2.keys(): 
    if dict2[x] == []: 
     dict2.keys().remove(x) 

,但没有奏效。

回答

12
.keys()

提供访问在字典中的键的清单,但改变它不是(一定)反映在字典中。您需要使用del dictionary[key]dictionary.pop(key)将其删除。

由于某些版本的Python的行为,您需要创建一个密钥列表的副本,以便事情能够正常工作。所以,如果写为您的代码将工作:

for x in list(dict2.keys()): 
    if dict2[x] == []: 
     del dict2[x] 
+6

不行的,因为你不能迭代过程中更改字典的大小。 – mklauber 2011-06-10 14:08:21

+0

针对Python 2.5/2.6/2.7/3.1进行了更正。 – 2011-06-10 14:24:01

+2

为什么'list'? dict2.keys()已经可迭代 – JBernardo 2011-06-10 14:32:58

1
for key in [ k for (k,v) in dict2.items() if not v ]: 
    del dict2[key] 
3
for x in dict2.keys(): 
    if dict2[x] == []: 
     del dict2[x] 
+1

使用.keys()会创建一个新的列表来迭代,从而允许您从原始列表中删除。 好工作 – mklauber 2011-06-10 14:09:42

+3

它不会在Python 3中这样做,这会引发'RuntimeError:迭代期间字典大小发生变化'。 – 2011-06-10 14:37:36

1

干净的,但它会创建一个字典的副本:Python支持字典内涵的

dict(filter(lambda x: x[1] != [], d.iteritems())) 
10

较新的版本:

dic = {i:j for i,j in dic.items() if j != []} 

这些比过滤器或循环更具可读性

1

随着发电机对象,而不是列表:

a = {'1': [], 'f':[1,2,3]} 
dict((data for data in a.iteritems() if data[1])) 
2

为什么不保留那些不为空,让GC删除剩菜?我的意思是:

dict2 = dict([ (k,v) for (k,v) in dict2.items() if v]) 
0
def dict_without_empty_values(d): 
    return {k:v for k,v in d.iteritems() if v} 


# Ex; 
dict1 = { 
    'Q': 1, 
    'P': 0, 
    'S': None, 
    'R': 0, 
    'T': '', 
    'W': [], 
    'V': {}, 
    'Y': None, 
    'X': None, 
} 

print dict1 
# {'Q': 1, 'P': 0, 'S': None, 'R': 0, 'T': '', 'W': [], 'V': {}, 'Y': None, 'X': None} 

print dict_without_empty_values(dict1) 
# {'Q': 1} 
+1

你能解释一下你的代码吗? – Bulat 2015-08-21 22:04:32

+0

我们怎样才能做到这一点是在python2.6? – user482963 2017-03-29 14:14:18