我今天需要拼写一本字典.我想要的意思是:
{'_id': 0, 'sub': {'a': 1, 'b':2}}
Run Code Online (Sandbox Code Playgroud)
成为:
{'_id': 0, 'a':1, 'b':2}
Run Code Online (Sandbox Code Playgroud)
所以我觉得我可以聪明一点,然后拉掉下面的单线.
x = dict(_id=0, sub=dict(a=1, b=2))
y = x.pop('sub').update(x) # incorrect result
Run Code Online (Sandbox Code Playgroud)
这导致了y = None.
所以我显然采取了:
x = dict(_id=0, sub=dict(a=1, b=2))
y = x.pop('sub')
y.update(x) # correct result
Run Code Online (Sandbox Code Playgroud)
设置"良好的表达性编码实践"有助于片刻,我想理解为什么上面的单行方法会产生None.我原本以为x.pop('sub')会导致某个堆栈上的临时dict,原来的x dict会立即更新.然后堆栈对象将接收链中的下一个方法,即更新.这显然似乎并非如此.
为了让社区更好地理解(并且显然是我的) - python如何解决单行并导致无?
Mar*_*ers 10
该.update()方法返回None,因为它会就地修改受影响的字典..pop()确实返回弹出的值,嵌套的字典.
您正在更新包含的内容dict,为什么不更新父级 dict呢?
x.update(x.pop('sub'))
Run Code Online (Sandbox Code Playgroud)
结果:
>>> x = dict(_id=0, sub=dict(a=1, b=2))
>>> x.update(x.pop('sub'))
>>> x
{'a': 1, '_id': 0, 'b': 2}
Run Code Online (Sandbox Code Playgroud)
或者你可以递归地做到这一点:
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))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |