我一直在寻找它给我的错误,但我不太清楚。他们用for k, v in dbdata.items
做了一些事情,但这对我来说既不适用,也给了我其他错误。
好吧,我想删除多个项目。
tskinspath = ['1', '2']
#
dbdata = {}
dbdata['test'] = {}
dbdata['test']['skins_t'] = {}
# Adds the items
dbdata['test']['skins_t']['1'] = 1
dbdata['test']['skins_t']['2'] = 0
dbdata['test']['skins_t']['3'] = 0
dbdata['test']['skins_t']['4'] = 0
# This doesn't work
for item in dbdata["test"]["skins_t"]:
if item not in tskinspath:
if dbdata["test"]["skins_t"][item] == 0:
del dbdata["test"]["skins_t"][item]
# exceptions.RunetimeError: dictonary changed size during iteration
答案 0 :(得分:0)
错误消息说明:您不应修改要迭代的字典。试试
for item in set(dbdata['test']['skins_t']):
...
这样,您将遍历包含dbdata['test']['skins_t']
中所有键的集合。
答案 1 :(得分:0)
而不是遍历字典,迭代dict.items()
:
for key, value in dbdata["test"]["skins_t"].items():
if key not in tskinspath:
if value == 0:
del dbdata["test"]["skins_t"][key]
在py3.x上使用list(dbdata["test"]["skins_t"].items())
。
<强>替代:强>
to_be_deleted = []
for key, value in dbdata["test"]["skins_t"].iteritems():
if key not in tskinspath:
if value == 0:
to_be_deleted.append(key)
for k in to_be_deleted:
del dbdata["test"]["skins_t"][k]
答案 2 :(得分:0)
由于问题的详细信息不在问题范围之内,如果您正在寻找从给定dict
删除多个密钥的解决方案,请使用此代码段
[s.pop(k) for k in list(s.keys()) if k not in keep]
此外,您可以通过理解创建新的dict
。
new_dict = { k: old_dict[k] for k in keep }