我有一个字典的列表,其中一些值是空的:
d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}
在创建这些列表的最后,我想在返回字典之前删除这些空列表。我试着这样做:
for i in d:
if not d[i]:
d.pop(i)
但是我得到了一个RuntimeError。我知道你不能在字典中添加/删除元素,而迭代它…那有什么解决办法呢?
请参阅在迭代Python字典时修改它,以了解这会导致问题的引用以及原因。
我有一个字典的列表,其中一些值是空的:
d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}
在创建这些列表的最后,我想在返回字典之前删除这些空列表。我试着这样做:
for i in d:
if not d[i]:
d.pop(i)
但是我得到了一个RuntimeError。我知道你不能在字典中添加/删除元素,而迭代它…那有什么解决办法呢?
请参阅在迭代Python字典时修改它,以了解这会导致问题的引用以及原因。
当前回答
我会尽量避免在第一个位置插入空列表,但是,通常会使用:
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]
其他回答
出现运行时错误的原因是,当数据结构在迭代过程中发生变化时,您无法对其进行迭代。
实现您所寻找的一种方法是使用一个列表来附加您想要删除的键,然后使用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数据结构。)
这招对我很管用:
d = {1: 'a', 2: '', 3: 'b', 4: '', 5: '', 6: 'c'}
for key, value in list(d.items()):
if value == '':
del d[key]
print(d)
# {1: 'a', 3: 'b', 6: 'c'}
将字典项强制转换为list将创建其项的列表,因此可以遍历该列表并避免RuntimeError。
Python 3不允许在迭代(使用上面的for循环)字典时删除。有各种各样的替代方案;一个简单的方法就是换线
for i in x.keys():
with
for i in list(x)
我会尽量避免在第一个位置插入空列表,但是,通常会使用:
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]