我正在处理一些代码,该代码将具有非常详细信息的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",
}
}
]
挑战在于,并非所有商品都包含变体。我看到两个潜在的解决方案:
variations
字段应用于字典。variations
字段,如果原始项目包含变体,则将其填写。我可能会选择第二种解决方案。但是,有没有办法在字典理解中有条件地包含特定字段?
编辑:换句话说,在字典理解中是否可能使用方法1?
所需输出的示例(使用字典理解)如下:
{
"Object A": {
"state": "foo",
"variants": ["foo", "bar", "baz"]
},
"Object B": {
"state": "foo"
}
}
我发现了change the entries conditionally或filter the entries的其他一些问题,但是这些不是无条件地创建有条件地缺少(该项目中的)特定字段的项目。
我不确定您是否知道可以在作业中使用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'])
您可以将过程传递给函数吗?
def check_age(age):
return age >= 18
my_dic = {
"age": 25,
"allowed_to_drink": check_age(25)
}
您最终得到的值是函数调用的结果
{'age': 25, 'allowed_to_drink': True}
我不知道如何实现,但是需要一些思考。