61

I have a dictionary

d = {'a':1, 'b':2, 'c':3}

I need to remove a key, say c and return the dictionary without that key in one function call

{'a':1, 'b':2}

d.pop('c') will return the key value - 3 - instead of the dictionary.

I am going to need one function solution if it exists, as this will go into comprehensions

4

6 回答 6

81

这个怎么样:

{i:d[i] for i in d if i!='c'}

它被称为Dictionary Comprehensions,它从 Python 2.7 开始可用。

或者如果您使用的 Python 版本早于 2.7:

dict((i,d[i]) for i in d if i!='c')
于 2013-07-16T00:04:30.100 回答
21

为什么不自己滚动?这可能比使用字典推导创建一个新的更快:

def without(d, key):
    new_d = d.copy()
    new_d.pop(key)
    return new_d
于 2013-07-16T00:08:40.113 回答
10

如果您需要一个执行此操作的表达式(因此您可以在 lambda 或理解中使用它),那么您可以使用这个小技巧:使用字典和弹出元素创建一个元组,然后从元组:

(foo, foo.pop(x))[0]

例如:

ds = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}]
[(d, d.pop('c'))[0] for d in ds]
assert ds == [{'a': 1, 'b': 2}, {'a': 4, 'b': 5}]

请注意,这实际上修改了原始字典,因此尽管是一种理解,但它并不是纯粹的功能性。

于 2020-01-31T00:34:10.617 回答
5

当您调用pop原始字典时,会被修改到位。

你可以从你的函数中返回那个。

>>> a = {'foo': 1, 'bar': 2}
>>> a.pop('foo')
1
>>> a
{'bar': 2}
于 2018-08-24T02:15:18.100 回答
0

我的解决方案

item = dict({"A": 1, "B": 3, "C": 4})
print(item)
{'A': 1, 'B': 3, 'C': 4}

new_dict = (lambda d: d.pop('C') and d)(item)
print(new_dict)
{'A': 1, 'B': 3}
于 2021-10-28T03:06:12.783 回答
0

这会起作用,

(lambda dict_,key_:dict_.pop(key_,True) and dict_)({1:1},1)

编辑这将删除字典中存在的键,并将返回没有键值对的字典

在 python 中,有一些函数可以改变一个对象,并返回一个值而不是改变的对象,{}.pop 函数就是一个例子。

我们可以使用示例中的 lambda 函数,或者下面更通用的(lambda func:obj:(func(obj) and False) 或 obj)来改变这种行为,并获得预期的行为。

于 2017-03-27T11:49:21.280 回答