首页 > 解决方案 > 字典中的 Python 条件键/值

问题描述

我有以下代码:

payload = [
    {
        'car': {
            'vin': message.car_reference.vin,
            'brand': message.car_reference.model_manufacturer,
            'model': message.car_reference.model_description,
            'color': message.car_reference.color,
        },
    }
]

message.car_reference 上唯一保证不为 None 的字段是 vin。我仍然希望其他键(品牌、型号、颜色)只有在它们有值的情况下才会出现在字典中。

有效负载被发送到外部 API,如果例如 color = None,则会给我一个错误。

如果它们的值不是None,我如何使它只添加键和值?

到目前为止,我想到的是多个 if 语句,但这看起来很糟糕,我认为这不是正确的方法。

标签: pythondjangodjango-models

解决方案


此代码递归地查看数据结构内部

def recur_remover(collection):
    if isinstance(collection, list):
        # This allows you to pass in the whole list immediately
        for item in collection:
            recur_remover(item)
    
    elif isinstance(collection, dict):
        # When you hit a dictionary, this checks if there are nested dictionaries    
        to_delete = []
        for key, val in collection.items():
            if val is None:
                to_delete.append(key)
            else:
                recur_remover(collection[key])
        for k in to_delete:
            # deletes all unwanted keys at once instead of mutating the dict each time
            del collection[k]
    else:
        return

推荐阅读