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

在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”方法是什么?您可以使用一个

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

我们有一本名为myDict的字典:

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因为它在语义上更正确。谢谢你的回答!A
    dict
    -理解是个好主意,但在我看来,问题是如何从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'}