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

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


当前回答

pop改变了字典。

 >>> lol = {"hello": "gdbye"}
 >>> lol.pop("hello")
     'gdbye'
 >>> lol
     {}

如果你想保留原件,你可以复制它。

其他回答

在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})>

下面是使用列表理解的另一种变体:

original_d = {'a': None, 'b': 'Some'}
d = dict((k,v) for k, v in original_d.iteritems() if v)
# result should be {'b': 'Some'}

该方法基于本文中的答案:从字典中删除带有空字符串的键的有效方法

对于Python 3,这是

original_d = {'a': None, 'b': 'Some'}
d = dict((k,v) for k, v in original_d.items() if v)
print(d)

del语句删除一个元素:

del d[key]

请注意,这会改变现有的字典,因此字典的内容会对任何引用同一实例的其他人发生变化。要返回新词典,请复制词典:

def removekey(d, key):
    r = dict(d)
    del r[key]
    return r

dict()构造函数生成一个浅副本。要进行深度复制,请参阅复制模块。


注意,为每个dict del/assignment等制作一份副本。意味着你将从恒定时间变为线性时间,同时也使用线性空间。对于小字典来说,这不是问题。但是,如果您计划制作大量大型字典的副本,您可能需要一种不同的数据结构,如HAMT(如本答案所述)。

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
    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)