如何在Python中从字典中删除项目?

在不修改原始词典的情况下,如何获取删除了该项的另一个词典?


当前回答

只需调用del d[“key”]。

然而,在生产中,检查d中是否存在“key”始终是一个好的做法。

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

其他回答

d = {1: 2, '2': 3, 5: 7}
del d[5]
print 'd = ', d

结果:d={1:2,“2”:3}

…我如何从字典中删除项目以返回副本(即不修改原件)?

dict是用于此目的的错误数据结构。

当然,复制字典并从副本中弹出是有效的,建立一个新的字典并理解它也是有效的,但是所有的复制都需要时间,你已经用线性时间操作代替了恒定时间操作。并且所有这些活动副本一次占用每个副本的空间线性空间。

其他数据结构,如哈希数组映射尝试,正是为这种用例而设计的:添加或删除元素会在对数时间内返回副本,并与原始元素共享大部分存储空间。1

当然,也有一些缺点。性能是对数而不是常数(尽管基数较大,通常为32-128)。而且,虽然可以使非变异API与dict相同,但“变异”API明显不同。最重要的是,Python中没有HAMT电池。2

pyristent库是Python的基于HAMT的dict替换(以及各种其他类型)的一个非常可靠的实现。它甚至有一个漂亮的evolver API,用于将现有的变异代码尽可能平滑地移植到持久代码。但如果你想明确地返回拷贝而不是变异,你可以这样使用:

>>> from pyrsistent import m
>>> d1 = m(a=1, b=2)
>>> d2 = d1.set('c', 3)
>>> d3 = d1.remove('a')
>>> d1
pmap({'a': 1, 'b': 2})
>>> d2
pmap({'c': 3, 'a': 1, 'b': 2})
>>> d3
pmap({'b': 2})

d3=d1.remove('a')正是问题所要求的。

如果您在pmap中嵌入了dict和list等可变数据结构,那么仍然会存在别名问题,您只能通过一直保持不变,嵌入pmap和pvectors来解决这个问题。


1.HAMT在Scala、Clojure、Haskell等语言中也很流行,因为它们在无锁编程和软件事务内存方面表现得很好,但这两者在Python中都不太相关。

2.事实上,stdlib中有一个HAMT,用于contextvars的实现。先前撤回的政治公众人物解释了原因。但这是库的隐藏实现细节,而不是公共集合类型。

在Python 3中,“dict”对象没有属性“remove”。

但使用immutables包,可以执行允许对Map对象应用更改并创建新的(派生的)Maps的突变:

import immutables
map = immutables.Map(a=1, b=2)
map1 = map.delete('b')
print(map, map1)
# will print:
#   <immutables.Map({'b': 2, 'a': 1})>
#   <immutables.Map({'a': 1})>

del陈述就是你要找的。如果您有一个名为foo的字典,其键名为“bar”,则可以像这样从foo中删除“bar”:

del foo['bar']

请注意,这将永久修改正在操作的词典。如果您想保留原始词典,则必须事先创建一个副本:

>>> foo = {'bar': 'baz'}
>>> fu = dict(foo)
>>> del foo['bar']
>>> print foo
{}
>>> print fu
{'bar': 'baz'}

dict调用生成一个浅显的副本。如果需要深度复制,请使用copy.depcopy。

为了方便,您可以复制并粘贴以下方法:

def minus_key(key, dictionary):
    shallow_copy = dict(dictionary)
    del shallow_copy[key]
    return shallow_copy

这里是顶级设计方法:

def eraseElement(d,k):
    if isinstance(d, dict):
        if k in d:
            d.pop(k)
            print(d)
        else:
            print("Cannot find matching key")
    else:
        print("Not able to delete")


exp = {'A':34, 'B':55, 'C':87}
eraseElement(exp, 'C')

我将字典和我想要的键传递到我的函数中,验证它是否是字典,以及键是否正常,如果两者都存在,则从字典中删除值并打印出剩余的值。

输出:{“B”:55,“A”:34}

希望这有帮助!