Skip to main content
 首页 » 编程设计

python之在 Python 中使用 dict 进行链式方法调用

2025年05月04日10jackei

我今天需要弄平一本字典。意思是我想要:

{'_id': 0, 'sub': {'a': 1, 'b':2}} 

成为:

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

所以我想我可以聪明地完成以下一行。

一行:

x = dict(_id=0, sub=dict(a=1, b=2)) 
y = x.pop('sub').update(x)  # incorrect result 

这导致 y = None。

所以我显然采取了:

多步骤:

x = dict(_id=0, sub=dict(a=1, b=2)) 
y = x.pop('sub') 
y.update(x)   # correct result 

暂时将“良好的表达编码实践”放在一边,我想了解为什么上面的One-liner 方法会产生None。我原以为 x.pop('sub') 会在某个地方的堆栈上产生一个临时字典,并且原始 x 字典会立即更新。然后堆栈对象将接收链中的下一个方法,即更新。显然,事实并非如此。

为了让社区更好地理解(并且显然是我的)- python 如何解析单行代码并导致无?

请您参考如下方法:

.update() 方法返回None,因为它就地改变了受影响的字典。 .pop() 确实返回弹出的值,即嵌套字典。

您正在更新包含的 dict,为什么不更新 parent dict 呢?

x.update(x.pop('sub')) 

结果:

>>> x = dict(_id=0, sub=dict(a=1, b=2)) 
>>> x.update(x.pop('sub')) 
>>> x 
{'a': 1, '_id': 0, 'b': 2} 

或者您可以递归地执行此操作:

def inplace_flatten(d): 
    keys = list(d.keys()) 
    for k in keys: 
        if isinstance(d[k], dict): 
            inplace_flatten(d[k]) 
            d.update(d.pop(k))