簡體   English   中英

帶有dict的Python中的鏈接方法調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM