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

ele*_*ent 13 python dictionary python-2.7 python-3.x

我想知道是否有一种简单的方法可以通过值从python字典中删除一个多个字典元素.

我们有一个字典叫myDict:

myDict = {1:"egg", "Answer":42, 8:14, "foo":42}
Run Code Online (Sandbox Code Playgroud)

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

实施建议:

  1. 获取某个值的所有键的列表myDict
    (例如,参见字典中的值获取键).

  2. 从中删除此dict元素(基于找到的键)myDict
    (有关更多信息,请参阅从字典中删除元素.)

那么,您认为现在用Python实现这个问题的最优雅,最"pythonic"的方式是什么?

A.J*_*pal 25

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

myDict = {key:val for key, val in myDict.items() if val != 42}
Run Code Online (Sandbox Code Playgroud)

因此:

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

  • 我不会将它命名为`item,key`,而是将其命名为`key,val`而使用`val!= 42`,因为它在语义上更正确. (9认同)

cru*_*ane 8

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

    for key, value in dict(myDict).items():
        if value == 42:
            del mydict[key]
Run Code Online (Sandbox Code Playgroud)

在下面的评论中添加问题的答案,因为它对评论来说太大了.这是一个快速的控制台会话,显示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'}
`
Run Code Online (Sandbox Code Playgroud)

  • `myDict.copy()`效率更高 (2认同)