1

今日は辞書を平らにする必要がありました。私が欲しかった意味:

{'_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が生成され、元のxdictがすぐに更新されると思いました。次に、スタックオブジェクトは、更新であるチェーン内の次のメソッドを受け取ります。これは明らかにそうではないようです。

コミュニティの理解を深めるために(そして明らかに私のものです)-Pythonはどのようにしてワンライナーを解決し、結果はなしになりますか?

4

3 に答える 3

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))
于 2012-11-26T18:28:20.333 に答える
2

yの結果を取得するため、dict.update()つまりNone

于 2012-11-26T18:28:44.240 に答える
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
于 2012-11-26T18:28:38.500 に答える