首页 文章

如何从Python字典中删除密钥?

提问于
浏览
1179

当我试图从字典中删除一个键时,我写道:

if 'key' in myDict:
    del myDict['key']

有这样一种方式吗?

8 回答

  • 283

    我花了一些时间才弄明白 my_dict.pop("key", None) 到底在做什么 . 所以我将这个作为一个答案,以节省其他人的谷歌搜索时间:

    pop(key [,default])如果key在字典中,则将其删除并返回其值,否则返回default . 如果未给出default并且key不在字典中,则引发KeyError

    Documentation

  • 120

    如果你需要在一行代码中从字典中删除很多键,我认为使用map()非常简洁,Pythonic可读:

    myDict = {'a':1,'b':2,'c':3,'d':4}
    map(myDict.pop, ['a','c']) # The list of keys to remove
    >>> myDict
    {'b': 2, 'd': 4}
    

    如果您需要在弹出不在字典中的值时捕获错误,请在map()中使用lambda,如下所示:

    map(lambda x: myDict.pop(x,None), ['a','c','e'])
    [1, 3, None] # pop returns
    >>> myDict
    {'b': 2, 'd': 4}
    

    有用 . 即使myDict没有'e'键,'e'也不会导致错误 .

  • 1972

    特别要回答“有这样一种方式吗?”

    if 'key' in myDict: del myDict['key']
    

    ......好吧,你问;-)

    但是,您应该考虑这种从 dict 删除对象的方式是not atomic -it可能 'key'if 语句中可能在 myDict 中,但在执行 del 之前可能会被删除,在这种情况下 del 将失败并且 KeyError . 鉴于此,无论是use dict.pop还是其他方面都是最安全的

    try:
        del myDict['key']
    except KeyError:
        pass
    

    当然,这绝对不是一个单行 .

  • 27

    使用“del”关键字:

    del dict[key]
    
  • 24

    使用dict.pop()

    my_dict.pop('key', None)
    

    如果字典中存在 key ,则返回 my_dict[key] ,否则返回 None . 如果未指定第二个参数(即 my_dict.pop('key') )且 key 不存在,则引发 KeyError .

  • 16

    使用:

    >>> if myDict.get(key): myDict.pop(key)
    

    其他方式:

    >>> {k:v for k, v in myDict.items() if k != 'key'}
    

    您可以按条件删除 . 如果 key 不存在则没有错误 .

  • 8

    我们可以通过以下几种方法从Python字典中删除密钥 .

    使用 del 关键字;这几乎和你做的一样 -

    myDict = {'one': 100, 'two': 200, 'three': 300 }
     print(myDict)  # {'one': 100, 'two': 200, 'three': 300}
     if myDict.get('one') : del myDict['one']
     print(myDict)  # {'two': 200, 'three': 300}
    

    Or

    我们可以这样做:

    但是应该记住,在这个过程中实际上它不会从字典中获得任何键,而不是从该字典中创建特定键 excluded . 另外,我发现它返回的字典与 myDict 的排序不同 .

    myDict = {'one': 100, 'two': 200, 'three': 300, 'four': 400, 'five': 500}
    {key:value for key, value in myDict.items() if key != 'one'}
    

    如果我们在shell中运行它,它将执行像 {'five': 500, 'four': 400, 'three': 300, 'two': 200} 这样的事情 - 注意它与 myDict 的顺序不同 . 再次,如果我们尝试打印 myDict ,那么我们可以看到所有键,包括我们通过这种方法从字典中排除的键 . 但是,我们可以通过将以下语句分配给变量来创建新字典:

    var = {key:value for key, value in myDict.items() if key != 'one'}
    

    现在,如果我们尝试打印它,那么它将遵循父订单:

    print(var) # {'two': 200, 'three': 300, 'four': 400, 'five': 500}
    

    Or

    使用 pop() 方法 .

    myDict = {'one': 100, 'two': 200, 'three': 300}
    print(myDict)
    
    if myDict.get('one') : myDict.pop('one')
    print(myDict)  # {'two': 200, 'three': 300}
    

    delpop 之间的区别在于,使用 pop() 方法,如果需要,我们实际上可以存储 key's value ,如下所示:

    myDict = {'one': 100, 'two': 200, 'three': 300}
    if myDict.get('one') : var = myDict.pop('one')
    print(myDict) # {'two': 200, 'three': 300}
    print(var)    # 100
    

    如果您觉得这很有用,请将叉子this gist用于将来参考 .

  • 5

    上述三种解决方案的时间安排 .

    小字典:

    >>> import timeit
    >>> timeit.timeit("d={'a':1}; d.pop('a')")
    0.23399464370632472
    >>> timeit.timeit("d={'a':1}; del d['a']")
    0.15225347193388927
    >>> timeit.timeit("d={'a':1}; d2 = {key: val for key, val in d.items() if key != 'a'}")
    0.5365207354998063
    

    较大的字典:

    >>> timeit.timeit("d={nr: nr for nr in range(100)}; d.pop(3)")
    5.478138627299643
    >>> timeit.timeit("d={nr: nr for nr in range(100)}; del d[3]")
    5.362219126590048
    >>> timeit.timeit("d={nr: nr for nr in range(100)}; d2 = {key: val for key, val in d.items() if key != 3}")
    13.93129749387532
    

相关问题