python json删除key - 如果密钥存在,则删除字典项目




dict删除多个key python字典遍历 (4)

方法:计算键删除,mutate字典

让我们调用keys来获取您要删除的keys的列表/迭代器。 我会这样做:

keys_to_remove = set(keys).intersection(set(mydict.keys()))
for key in keys_to_remove:
    del mydict[key]

你先计算所有受影响的项目并对它们进行操作。

方法:计算要保留的键,用这些键制作新的词典

我更喜欢创建一个新的字典来改变现有的字典,所以我可能也会考虑这个:

keys_to_keep = set(mydict.keys()) - set(keys)
new_dict = {k: v for k, v in mydict.iteritems() if k in keys_to_keep}

要么:

keys_to_keep = set(mydict.keys()) - set(keys)
new_dict = {k: mydict[k] for k in keys_to_keep}

这个问题在这里已经有了答案:

除了以下情况外,是否还有其他方式可以删除字典中的项目:

if key in mydict:
    del mydict[key]

这个场景是我给出了一个从给定字典中删除的键的集合,但我不确定它们是否都存在于字典中。 以防万一我错过了更有效的解决方案。


你可以使用dict.pop

 mydict.pop("key", None)

请注意,如果没有给出第二个参数,即None ,则如果该键不在字典中,则引发KeyError 。 提供第二个参数可防止出现条件异常。


还有:

try:
    del mydict[key]
except KeyError:
    pass

这只会执行1次查找而不是2次。但是, except子句是昂贵的,所以如果最终经常碰到except子句,这可能会比现有的子句效率低。


在控制台中进行的简单测试表明,在迭代它时不能修改字典:

>>> mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}
>>> for k, v in mydict.iteritems():
...    if k == 'two':
...        del mydict[k]
...
------------------------------------------------------------
Traceback (most recent call last):
  File "<ipython console>", line 1, in <module>
RuntimeError: dictionary changed size during iteration

正如delnan的回答所述,当迭代器试图移动到下一个条目时,删除条目会导致问题。 相反,使用keys()方法获取密钥列表并使用它:

>>> for k in mydict.keys():
...    if k == 'two':
...        del mydict[k]
...
>>> mydict
{'four': 4, 'three': 3, 'one': 1}

如果需要根据项目值删除,请改用items()方法:

>>> for k, v in mydict.items():
...     if v == 3:
...         del mydict[k]
...
>>> mydict
{'four': 4, 'one': 1}

编辑:

以上不适用于Python3,并会产生RuntimeError

RuntimeError:迭代期间字典更改大小。

发生这种情况是因为mydict.keys()返回一个迭代器而不是一个列表。 正如在注释中指出的,只需将mydict.keys()转换为list(mydict.keys()) ,它就可以工作。





python python-2.7