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

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

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

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

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


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


当前回答

出现运行时错误的原因是,当数据结构在迭代过程中发生变化时,您无法对其进行迭代。

实现您所寻找的一种方法是使用一个列表来附加您想要删除的键,然后使用dictionary上的pop函数在遍历列表时删除已标识的键。

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

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

for x in pop_list:
        d.pop(x)
print (d)

其他回答

你只需要使用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数据结构。)

出现运行时错误的原因是,当数据结构在迭代过程中发生变化时,您无法对其进行迭代。

实现您所寻找的一种方法是使用一个列表来附加您想要删除的键,然后使用dictionary上的pop函数在遍历列表时删除已标识的键。

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

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

for x in pop_list:
        d.pop(x)
print (d)

对于Python 3:

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

避免“迭代时字典改变大小错误”。

例如:“当你试图删除某个键时”,

只需使用'list'和'.items()'。这里有一个简单的例子:

my_dict = {
    'k1':1,
    'k2':2,
    'k3':3,
    'k4':4
 
    }
    
print(my_dict)

for key, val in list(my_dict.items()):
    if val == 2 or val == 4:
        my_dict.pop(key)

print(my_dict)

输出:

{'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}

{'k1': 1, 'k3': 3}

这只是一个例子。根据您的情况/需求更改它。