我有一本字典
d = {'a':1, 'b':2, 'c':3}
我需要删除一个键,比如说c,并在一个函数调用中返回不含该键的字典
{'a':1, 'b':2}
d.pop('c')将从字典中返回键值为3而不是字典本身。
如果有的话,我需要一个函数解决方案,因为这将进入综合体
我有一本字典
d = {'a':1, 'b':2, 'c':3}
我需要删除一个键,比如说c,并在一个函数调用中返回不含该键的字典
{'a':1, 'b':2}
d.pop('c')将从字典中返回键值为3而不是字典本身。
如果有的话,我需要一个函数解决方案,因为这将进入综合体
这个怎么样:
{i:d[i] for i in d if i!='c'}
它被称为字典推导式,自Python 2.7起可用。
如果您使用的是早于2.7版本的Python:
dict((i,d[i]) for i in d if i!='c')
dict(set(d.items()) - {('c', 0)})
但这是因为我知道'c'将取什么值。你的解决方案更加全面。 - Xeos(lambda x=d: {key:x[key] for key in x if key != 'c'})()
。 - Niko Pasanenk
而不是i
,因为它存储的是字典的键,而不是索引。此外,请注意可以通过k,v in f.items()
迭代,从而可以使用v
来引用值,而不是d[i]
。最终结果为:{k: v for k, v in d.items() if k != 'c'}
。 - tar为什么不自己动手呢?这可能比使用字典推导式创建一个新的更快:
def without(d, key):
new_d = d.copy()
new_d.pop(key)
return new_d
如果你需要一个能够在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}]
请注意,这实际上修改了原始字典,所以尽管它是一种推导方式,但它并不是完全函数式的。
pop
时,原始字典会被直接修改。>>> a = {'foo': 1, 'bar': 2}
>>> a.pop('foo')
1
>>> a
{'bar': 2}
[a.pop('foo'),a][1]
的替代方案。实际上,这是一种我想更普遍地使用的结构。它本质上是返回一系列语句的结果。 - WestCoastProjects我的解决方案
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}
这将会起作用,
(lambda dict_,key_:dict_.pop(key_,True) and dict_)({1:1},1)
编辑 如果字典中存在该键,则此操作将删除该键,并返回不包含该键值对的字典
在Python中,有些函数会直接修改对象并返回一个值,而不是修改后的对象,{}.pop函数就是一个例子。
我们可以使用lambda函数,如下面的示例,或更通用的方式 (lambda func:obj:(func(obj) and False) or obj) 来改变这种行为,并获得预期的结果。
{k:v for k,v in d.items() if k != 'c'}
d.pop('c')返回 d
- Victor Castillo TorresTrue
,因为首先您删除了c
的值,现在d = {'a':1, 'b':2}
,如果您return d
,它将返回{'a':1, 'b':2}
。 - Victor Castillo Torresd.pop('c')
是否会返回 d :) 是的,那样可以,但我不能使用它。我需要在推导式中使用它。 - Xeos