Python 字典仅在定义值时更新

Fra*_*fka 2 python dictionary data-structures

如果我运行以下代码:

import json

foo = [
    {
        "name": "Bob",
        "occupation": "",
        "standing": "good",
        "locations": ["California"],
        "meta": { "last_updated": "2018-01-15" }
    },
    {
        "name": "",
        "occupation": "Carpenter",
        "standing": "bad",
        "locations": ["Arizona"],
        "meta": { "last_updated": "2018-01-15", "email": "bob@domain.com" }
    },
]

output = {}
for i in foo:
    output.update(i)
print json.dumps(output)
Run Code Online (Sandbox Code Playgroud)

最终输出是:

{
    "locations": [
        "Arizona"
    ],
    "meta": {
        "email": "bob@domain.com",
        "last_updated": "2018-01-15"
    },
    "name": "",
    "occupation": "Carpenter",
    "standing": "bad"
}
Run Code Online (Sandbox Code Playgroud)

那很好。但是,我试图弄清楚如何将函数传递给更新方法,该方法基本上表示“仅在值已定义/不为空时更新”。因此,在第一次迭代中,名称是“Bob”,而在第二次迭代中,名称仍然是 Bob,因为名称本质上是未定义的。

最终输出如下所示:

{
    "locations": [
        "Arizona"
    ],
    "meta": {
        "email": "bob@domain.com",
        "last_updated": "2018-01-15"
    },
    "name": "Bob",
    "occupation": "Carpenter",
    "standing": "bad"
}
Run Code Online (Sandbox Code Playgroud)

小智 6

您可以过滤要更新的新词典,例如:

b = {'bla': '', 'b': 77, 'c': '9'}
new_b = { k: v for k,v in b.items() if v }
Run Code Online (Sandbox Code Playgroud)

new_b将不再bla作为一个元素。

所以,就你而言:

for i in foo:
    output.update({ k: v for k,v in i.items() if v })
Run Code Online (Sandbox Code Playgroud)