删除字典中的多个项目

时间:2013-10-07 10:54:29

标签: python dictionary del

我一直在寻找它给我的错误,但我不太清楚。他们用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

3 个答案:

答案 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 }