如何在字典理解中填充可选字段?

问题描述 投票:1回答:2

我正在处理一些代码,该代码将具有非常详细信息的json数据库处理为更简单的格式。它复制一些字段并将其他字段重新序列化为新的json文件。

我目前正在使用像MVCE这样的字典理解:

converted_data = {
    raw_item['name']: {
        'state': raw_item['field_a'],
        'variations': [variant for variant in raw_item['field_b']['variations']]
    } for raw_item in json.loads(my_file.read())
}

示例文件(不是正在使用的实际数据)是:

[
    {
        "name": "Object A",
        "field_a": "foo",
        "field_b": {
            "bar": "baz",
            "variants": [
                "foo",
                "bar",
                "baz"
            ]
        }
    },
    {
        "name": "Object B",
        "field_a": "foo",
        "field_b": {
            "bar": "baz",
        }
    }
]

挑战在于,并非所有商品都包含变体。我看到两个潜在的解决方案:

  1. 使用if语句有条件地将variations字段应用于字典。
  2. 为所有项目都包含一个空白的variations字段,如果原始项目包含变体,则将其填写。

我可能会选择第二种解决方案。但是,有没有办法在字典理解中有条件地包含特定字段?


编辑:换句话说,在字典理解中是否可能使用方法1?

所需输出的示例(使用字典理解)如下:

{
    "Object A": {
        "state": "foo",
        "variants": ["foo", "bar", "baz"]
    },
    "Object B": {
        "state": "foo"
    }
}

我发现了change the entries conditionallyfilter the entries的其他一些问题,但是这些不是无条件地创建有条件地缺少(该项目中的)特定字段的项目。

python dictionary-comprehension
2个回答
3
投票

我不确定您是否知道可以在作业中使用if,这似乎是一种非常干净的解决方法:

converted_data = {
    raw_item['name']: {
        'state': raw_item['field_a'],
        'variants': [] if 'variants' not in raw_item['field_b'] else
            [str(variant) for variant in raw_item['field_b']['variants']]
    } for raw_item in example
}

((注意:使用str()代替初始示例中提供的未定义函数)

在澄清问题之后,这是一个替代解决方案,它添加了一个不同的字典(如果没有字典,则缺少空的'variations'键:

converted_data = {
    raw_item['name']: {
        'state': raw_item['field_a'],
        'variants': [str(variant) for variant in raw_item['field_b']['variants']]
    } if 'variants' in raw_item['field_b'] else {
        'state': raw_item['field_a'],
    } for raw_item in example
}

如果问题实际上是:字典文字中的键/值对是否可以是可选的(这将解决您的问题),那么答案就是“否”。但是,对于这个简单的示例,以上实现相同。

如果现实生活中的情况更加复杂,只需按照此处给出的第一个解决方案来构造字典,然后在构造后使用del(dictionary['key'])删除具有None[]值的所有已添加键。

例如,在第一个示例之后,可以使用以下命令清除converted_data

for item in converted_data.values:
    if not item['variants']:
        del(item['variants'])

1
投票

您可以将过程传递给函数吗?

def check_age(age):
    return age >= 18

my_dic = {
    "age": 25,
    "allowed_to_drink": check_age(25)
}

您最终得到的值是函数调用的结果

{'age': 25, 'allowed_to_drink': True}

我不知道如何实现,但是需要一些思考。

© www.soinside.com 2019 - 2024. All rights reserved.