在python中,按值删除字典项的最佳方法是什么?
我想知道是否有简单的方法可以通过值从python字典中删除一个或多个字典元素 我们有一本名为myDict的字典:在python中,按值删除字典项的最佳方法是什么?,python,python-2.7,python-3.x,dictionary,Python,Python 2.7,Python 3.x,Dictionary,我想知道是否有简单的方法可以通过值从python字典中删除一个或多个字典元素 我们有一本名为myDict的字典: myDict = {1:"egg", "Answer":42, 8:14, "foo":42} 并希望删除值等于42的所有项目 实施建议: 在myDict中获取具有特定值的所有键的列表(例如,请参阅。) 从myDict中删除此dict元素(基于找到的键)(有关更多信息,请参阅。) 那么,您认为现在用Python实现这个问题的最优雅的和最“pythonic”方法是什么?您可以使用一个
myDict = {1:"egg", "Answer":42, 8:14, "foo":42}
并希望删除值等于42
的所有项目
实施建议:
myDict
中获取具有特定值的所有键的列表(例如,请参阅。)
myDict
中删除此dict元素(基于找到的键)(有关更多信息,请参阅。)
那么,您认为现在用Python实现这个问题的最优雅的和最“pythonic”方法是什么?您可以使用一个简单的
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'}
您必须创建一个副本进行迭代,因为在循环中更改字典的大小会导致运行时错误。使用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'}
`
使用字典理解 如果需要副本,请使用
iteritems()
如果您不需要词典的副本,可以使用viewitems()
您可以迭代副本并执行查找:
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,这应该是最有效的方法。我喜欢采用“点击列表”的方法,即迭代字典,然后将要删除的添加到列表中,然后在迭代后,从该列表中删除条目,如下所示:
hitList=[]
对于dictEntry:如果测试条件为hitList.append
对于hitList中的条目:
删除dict[条目]
这只是一些伪代码,但我在过去成功地使用了它我不会将其命名为
item,key
,而是将其命名为key,val
,并使用val!=42因为它在语义上更正确。谢谢你的回答!Adict
-理解是个好主意,但在我看来,问题是如何从dict中删除项目。我知道我们只需要将理解的结果dict分配给myDict
:myDict={key:val代表key,val代表myDict.items()如果val!=42}
,因此,如果您方便,请更改您的答案。请为否决票留下评论,以便我可以改进我的答案。谢谢!在Python3.x中,我们只使用.items()
而不是.iteritems()
和viewitems()
?是的,Python3.x和2.x中存在差异,但是您的问题没有用Python版本标记,所以我假设您正在寻找2.x解决方案。是的,对不起,您是对的。如果方便的话,您可以将这些额外的信息添加到您的答案中,这样我们就可以看到两个Python版本之间的差异。:)myDict.copy()
更有效。谢谢你指出这一点。这也会起作用,并且消除了在循环之前创建副本的额外行:对于key,value in dict(myDict)。items():
@cruane:非常感谢您的回答!也许你可以根据你的命令编辑你的答案。很高兴我能帮上忙。我将编辑答案以反映这些变化。@Padraiccanningham:myDict.copy()
和dict(myDict)之间有什么区别?谢谢!为什么要使用reversed()
来反转键列表?元素(即键和值对)没有在dict中排序,因此在我看来更改顺序是不必要的。@elegent,尝试在不反转的情况下执行此操作,您将看到。。。这是有效的!:)顺便说一句,你不需要3个右括号…@elegent,是的,输入错误。是的,实际上列表(dict)将适用于python2和3Ok。没问题,谢谢您的回答。我只是有点困惑“在myDict中获取值的第一个…键”的愿望有点可疑,@elegent,因为第一个的概念实际上不适用于字典。@user1656850:是的,你完全正确!非常感谢你指出这一点。我更新了问题:)我也更喜欢这种方法,因为不需要复制。它也适用于列表,只需存储索引,然后删除相应的元素,但首先从最高索引开始。
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'}