我有一个字典的列表,其中一些值是空的:

d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}

在创建这些列表的最后,我想在返回字典之前删除这些空列表。我试着这样做:

for i in d:
    if not d[i]:
        d.pop(i)

但是我得到了一个RuntimeError。我知道你不能在字典中添加/删除元素,而迭代它…那有什么解决办法呢?


请参阅在迭代Python字典时修改它,以了解这会导致问题的引用以及原因。


当前回答

只需使用字典推导式将相关项复制到一个新的词典中:

>>> d
{'a': [1], 'c': [], 'b': [1, 2], 'd': []}
>>> d = {k: v for k, v in d.items() if v}
>>> d
{'a': [1], 'b': [1, 2]}

在Python 2中:

>>> d
{'a': [1], 'c': [], 'b': [1, 2], 'd': []}
>>> d = {k: v for k, v in d.iteritems() if v}
>>> d
{'a': [1], 'b': [1, 2]}

其他回答

当字典在for循环中更改时,您不能遍历它。对列表进行类型转换并遍历该列表。这对我很管用。

    for key in list(d):
        if not d[key]:
            d.pop(key)

对于这种情况,我喜欢在修改原始字典的同时进行深度复制并循环遍历该副本。

如果查找字段位于列表中,则可以在列表的for循环中进行枚举,然后将位置指定为索引,以便在原始字典中访问该字段。

dictc={"stName":"asas"}
keys=dictc.keys()
for key in list(keys):
    dictc[key.upper()] ='New value'
print(str(dictc))

你只需要使用copy:

通过这种方式,您可以遍历原始字典字段,并在运行中更改所需的字典d。 它适用于每个Python版本,所以更清楚。

In [1]: d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}

In [2]: for i in d.copy():
   ...:     if not d[i]:
   ...:         d.pop(i)
   ...:         

In [3]: d
Out[3]: {'a': [1], 'b': [1, 2]}

(BTW -通常迭代你的数据结构的副本,而不是使用.copy字典或切片[:]列表,你可以使用import copy -> copy。Copy(对于浅拷贝,相当于字典支持的拷贝或列表支持的切片[:])或Copy .deepcopy数据结构。)

我会尽量避免在第一个位置插入空列表,但是,通常会使用:

d = {k: v for k,v in d.iteritems() if v} # re-bind to non-empty

如果在2.7之前:

d = dict( (k, v) for k,v in d.iteritems() if v )

或者是:

empty_key_vals = list(k for k in k,v in d.iteritems() if v)
for k in empty_key_vals:
    del[k]