链式方法用dict调用Python

时间:2012-11-26 18:23:53

标签: python

我今天需要拼写一本字典。我想要的意思是:

{'_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

设置“良好的表达性编码实践”,我想了解为什么上面的单线方法会产生None。我原本以为x.pop('sub')会导致某个堆栈上的临时dict,原来的x dict会立即更新。然后堆栈对象将接收链中的下一个方法,即更新。这显然不是这种情况。

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

3 个答案:

答案 0 :(得分:10)

.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))

答案 1 :(得分:2)

因为y得到dict.update()的结果,即None

答案 2 :(得分:1)

这应该可以解决问题

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