[英]Chained Method Calls in Python with dict
我今天需要整理一本字典。 我想要的意思是:
{'_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
设置“表现良好的编码实践” asside了一会儿,我想明白为什么上述收益率的一个班轮方法None
。 我本以为x.pop('sub')会导致某个地方的堆栈上出现临时字典,而原始的x字典会立即更新。 然后,堆栈对象将接收链中的下一个方法,即更新。 显然似乎并非如此。
为了使社区更好地理解(并且清楚地是我的)-python如何解决一线问题并导致None ?
.update()
方法返回None
,因为它就地更改了受影响的字典。 .pop()
确实返回弹出的值,即嵌套字典。
您正在更新包含的dict
,为什么不更新父 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))
因为y
获得dict.update()
的结果,所以它为None
。
这应该可以解决问题
def flatten(d, answer=None):
if answer == None:
answer = {}
if not d:
return answer
else:
for k in d:
if isinstance(d[k], dict):
flatten(d[k], answer)
else:
answer[k] = d[k]
return answer
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.