我想知道是否有简单的方法从python字典中删除一个或 more 字典元素
我们有一个名为myDict
的词典:
myDict = {1:"egg", "Answer":42, 8:14, "foo":42}
并希望删除 值等于42
的所有项目。
实施建议:
在myDict
中获取特定值的所有键列表(例如参见get key by value in dictionary。)
从myDict
中删除此dict元素(基于找到的键)
(有关详细信息,请参阅Delete an element from a dictionary。)
那么,您现在认为在Python中实现此问题的最优雅和最“pythonic”方式是什么?
答案 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'}