我今天需要弄平一本字典。意思是我想要:
{'_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))
