use*_*318 203 python dictionary loops list
我用相同的错误检查了所有其他问题,但没有找到有用的解决方案= /
我有一个列表字典:
d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}
Run Code Online (Sandbox Code Playgroud)
其中一些值为空.在创建这些列表的最后,我想在返回字典之前删除这些空列表.目前我试图这样做如下:
for i in d:
if not d[i]:
d.pop(i)
Run Code Online (Sandbox Code Playgroud)
但是,这给了我运行时错误.我知道你在迭代它时不能在字典中添加/删除元素......这会是什么方法呢?
Mar*_*ers 370
在Python 2.x中,调用keys
会生成一个键的副本,您可以在修改时重复该键dict
:
for i in d.keys():
Run Code Online (Sandbox Code Playgroud)
请注意,这在Python 3.x中不起作用,因为keys
返回迭代器而不是列表.
另一种方法是使用list
强制键的副本.这个也适用于Python 3.x:
for i in list(d):
Run Code Online (Sandbox Code Playgroud)
Mar*_*ina 35
只需使用字典理解将相关项目复制到新的字典中
>>> 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]}
Run Code Online (Sandbox Code Playgroud)
Alo*_*rar 32
您只需要使用"复制":
在那种情况下,你迭代原始的字典字段,并在飞行中可以改变所需的字典(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]}
Run Code Online (Sandbox Code Playgroud)
sin*_*ium 19
这对我有用:
dict = {1: 'a', 2: '', 3: 'b', 4: '', 5: '', 6: 'c'}
for key, value in list(dict.items()):
if (value == ''):
del dict[key]
print(dict)
# dict = {1: 'a', 3: 'b', 6: 'c'}
Run Code Online (Sandbox Code Playgroud)
将字典项转换为列表会创建其项的列表,因此您可以对其进行迭代并避免RuntimeError
.
K.A*_*K.A 17
避免“字典在迭代错误期间更改大小”。
例如:“当您尝试删除某个键时”,
只需将“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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
这只是一个例子。根据您的情况/要求进行更改。
Jon*_*nts 11
我会尽量避免首先插入空列表,但通常会使用:
d = {k: v for k,v in d.iteritems() if v} # re-bind to non-empty
Run Code Online (Sandbox Code Playgroud)
如果在2.7之前:
d = dict( (k, v) for k,v in d.iteritems() if v )
Run Code Online (Sandbox Code Playgroud)
要不就:
empty_key_vals = list(k for k in k,v in d.iteritems() if v)
for k in empty_key_vals:
del[k]
Run Code Online (Sandbox Code Playgroud)
小智 9
您不能在 for 循环期间更改字典时对其进行迭代。制作一个列表并迭代该列表,它对我有用。
for key in list(d):
if not d[key]:
d.pop(key)
Run Code Online (Sandbox Code Playgroud)