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

What is the best way to remove a dictionary item by value in python?

我想知道是否有简单的方法按值从Python字典中删除一个或多个dictionary元素。

我们有一本叫myDict的字典:

1
myDict = {1:"egg","Answer":42, 8:14,"foo":42}

并希望删除所有值等于42的项。

实施建议:

  • myDict
    中获取某个值的所有键的列表(参见字典中的get key by value)。

  • myDict
    (有关详细信息,请参阅从字典中删除元素)中删除此dict元素或元素(基于找到的键)。

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


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

    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]

    在下面的评论中添加问题答案,因为它太大,无法发表评论。这里有一个简短的控制台会话,显示mydict.copy()dict(myDict)完成了相同的事情。

    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'}

    如果你想改变原来的口述,它应该是最有效的。


    使用字典理解。

    如果需要复印件,请使用iteritems()

    1
    2
    >>> {k:v for k, v in myDict.iteritems() if v!=42}
    {8: 14, 1: 'egg'}

    如果你不需要字典的副本,你可以使用viewitems()

    1
    2
    >>> {k:v for k, v in myDict.viewitems() if v!=42}
    {8: 14, 1: 'egg'}