What is the best way to remove a dictionary item by value in python?
我想知道是否有简单的方法按值从Python字典中删除一个或多个dictionary元素。
我们有一本叫
1 | myDict = {1:"egg","Answer":42, 8:14,"foo":42} |
并希望删除所有值等于
实施建议:
在
中获取某个值的所有键的列表(参见字典中的get key by value)。
从
(有关详细信息,请参阅从字典中删除元素)中删除此dict元素或元素(基于找到的键)。
那么,您认为在Python中实现这个问题的最优雅和最"Python式"的方法是什么?
您可以使用简单的
1 | myDict = {key:val for key, val in myDict.items() if val != 42} |
像这样的:
1 2 | >>> {key:val for key, val in myDict.items() if val != 42} {8: 14, 1: 'egg'} |
必须创建一个要迭代的副本,因为在循环内更改字典的大小会导致RuntimeError。使用items()迭代字典中的键、值对,并将每个值与要查找的值进行比较。如果匹配,则从字典中删除键。
1 2 3 | for key, value in dict(myDict).items(): if value == 42: del mydict[key] |
在下面的评论中添加问题答案,因为它太大,无法发表评论。这里有一个简短的控制台会话,显示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | >>>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'} ` |
我喜欢使用"hit list"方法,在这里迭代字典,然后将要删除的内容添加到列表中,然后在迭代之后,从该列表中删除条目,如下所示:
HistList=对于dicentry:if测试条件,hitlist.append
进入Hitlist:删除dict[条目]
这只是一些伪代码,但我过去已经成功地使用了它
您可以迭代副本并进行查找:
1 2 3 | for k in myDict.copy(): if myDict[k] == 42: del myDict[k] |
或者只复制密钥:
1 2 3 4 5 6 | 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'} |
如果你想改变原来的口述,它应该是最有效的。
使用字典理解。
如果需要复印件,请使用
1 2 | >>> {k:v for k, v in myDict.iteritems() if v!=42} {8: 14, 1: 'egg'} |
如果你不需要字典的副本,你可以使用
1 2 | >>> {k:v for k, v in myDict.viewitems() if v!=42} {8: 14, 1: 'egg'} |