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

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


当前回答

>>> def delete_key(dict, key):
...     del dict[key]
...     return dict
... 
>>> test_dict = {'one': 1, 'two' : 2}
>>> print delete_key(test_dict, 'two')
{'one': 1}
>>>

这不做任何错误处理,它假设密钥在dict中,您可能需要先检查它,如果没有,则引发

其他回答

可以试试我的方法。在一行。

yourList = [{'key':'key1','version':'1'},{'key':'key2','version':'2'},{'key':'key3','version':'3'}]
resultList = [{'key':dic['key']} for dic in yourList if 'key' in dic]
print(resultList)

没有,除了

def dictMinus(dct, val):
   copy = dct.copy()
   del copy[val]
   return copy

然而,通常只创建稍微修改过的字典的副本可能不是一个好主意,因为这会导致相对较大的内存需求。通常最好记录旧字典(如果需要),然后修改它。

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

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的实现。先前撤回的政治公众人物解释了原因。但这是库的隐藏实现细节,而不是公共集合类型。

使用del可以删除传递该值键的dict值

链接:德尔法

del dictionary['key_to_del']
    species = {'HI': {'1': (1215.671, 0.41600000000000004),
  '10': (919.351, 0.0012),
  '1025': (1025.722, 0.0791),
  '11': (918.129, 0.0009199999999999999),
  '12': (917.181, 0.000723),
  '1215': (1215.671, 0.41600000000000004),
  '13': (916.429, 0.0005769999999999999),
  '14': (915.824, 0.000468),
  '15': (915.329, 0.00038500000000000003),
 'CII': {'1036': (1036.3367, 0.11900000000000001), '1334': (1334.532, 0.129)}}

以下代码将复制dict物种并删除不在trans_HI中的项目

trans_HI=['1025','1215']
for transition in species['HI'].copy().keys():
    if transition not in trans_HI:
        species['HI'].pop(transition)