在python中按值删除字典项的最佳方法是什么?

时间:2015-03-23 19:28:58

标签: python python-2.7 python-3.x dictionary

我想知道是否有简单的方法从python字典中删除一个 more 字典元素

我们有一个名为myDict的词典:

myDict = {1:"egg", "Answer":42, 8:14, "foo":42}

并希望删除 等于42的所有项目。

实施建议:

  1. myDict中获取特定值的所有键列表(例如参见get key by value in dictionary。)

  2. myDict中删除此dict元素(基于找到的键)
    (有关详细信息,请参阅Delete an element from a dictionary。)

  3. 那么,您现在认为在Python中实现此问题的最优雅最“pythonic”方式是什么?

5 个答案:

答案 0 :(得分:19)

您可以使用简单的dict理解:

myDict = {key:val for key, val in myDict.items() if val != 42}

因此:

>>> {key:val for key, val in myDict.items() if val != 42}
{8: 14, 1: 'egg'}

答案 1 :(得分:8)

您必须创建一个副本以进行迭代,因为更改循环内部字典的大小会导致RunTimeError。使用items()迭代字典副本中的键值对,并将每个值与您要查找的值进行比较。如果匹配,请从字典中删除密钥。

    for key, value in dict(myDict).items():
        if value == 42:
            del mydict[key]

在下面的评论中添加问题的答案,因为它太大而无法发表评论。这是一个快速控制台会话,显示mydict.copy()dict(myDict)完成同样的事情。

>>>import copy
>>>dict1 = {1:"egg", "Answer":42, 8:14, "foo":42}
>>>dict2 = dict(dict1)
>>>dict3 = dict1.copy()
>>>dict4 = dict1
>>>dict1[1] = "egg sandwich"
>>>dict1
{'Answer': 42, 1: 'egg sandwich', 'foo': 42, 8: 14}
>>>dict2
{'Answer': 42, 1: 'egg', 'foo': 42, 8: 14}
>>>dict3
{'Answer': 42, 1: 'egg', 'foo': 42, 8: 14}
>>>dict4
{'Answer': 42, 1: 'egg sandwich', 'foo': 42, 8: 14}
>>>dict2['foo'] = "I pity the"
dict1
>>>{'Answer': 42, 1: 'egg sandwich', 'foo': 42, 8: 14}
>>>dict2
{'Answer': 42, 1: 'egg', 'foo': 'I pity the', 8: 14}
>>>dict3
{'Answer': 42, 1: 'egg', 'foo': 42, 8: 14}
>>>dict4
{'Answer': 42, 1: 'egg sandwich', 'foo': 42, 8: 14}
>>>dict4[8] = "new"
>>>dict1
{'Answer': 42, 1: 'egg sandwich', 'foo': 42, 8: 'new'}
>>>dict2
{'Answer': 42, 1: 'egg', 'foo': 'I pity the', 8: 14}
>>>dict3
{'Answer': 42, 1: 'egg', 'foo': 42, 8: 14}
>>>dict4
{'Answer': 42, 1: 'egg sandwich', 'foo': 42, 8: 'new'}
`

答案 2 :(得分:2)

我喜欢按照“命中列表”的方法迭代字典,然后将要删除的字段添加到列表中,然后在迭代后删除该列表中的条目,如下所示:

hitList = [] for dictEntry:if test condition,hitList.append

用于在hitList中输入: 删除字典[条目]

这只是一些伪代码,但我过去已经成功了

答案 3 :(得分:1)

您可以迭代副本并进行查找:

for k in myDict.copy():
    if myDict[k] == 42:
        del myDict[k]

或只复制键:

myDict = {1:"egg", "Answer":42, 8:14, "foo":42}
for k in list(myDict):
    if myDict[k] == 42:
        del myDict[k]
print(myDict)
{8: 14, 1: 'egg'}

如果你想改变原来的dict应该是最有效的。

答案 4 :(得分:0)

使用词典理解。

如果您需要使用iteritems()

的副本
>>> {k:v for k, v in myDict.iteritems() if v!=42}
{8: 14, 1: 'egg'}

如果您不需要字典副本,可以使用viewitems()

>>> {k:v for k, v in myDict.viewitems() if v!=42}
{8: 14, 1: 'egg'}