【发布时间】:2019-10-24 08:31:42
【问题描述】:
我正在尝试基于键 specs 合并对象,大多数键结构是一致的,考虑到只有在 company_name 相同时才会发生合并(在此示例中,我只有一个company_name) 并且如果 only(名称、{颜色、类型、许可证、描述)在多个列表中相等。
[
{
"company_name": "GreekNLC",
"metadata": [
{
"name": "Bob",
"details": [
{
"color": "black",
"type": "bmw",
"license": "4DFLK",
"specs": [
{
"properties": [
{
"info": [
"sedan",
"germany"
]
},
{
"info": [
"drive",
"expensive"
]
}
]
}
],
"description": "amazing car"
}
]
},
{
"name": "Bob",
"car_details": [
{
"color": "black",
"type": "bmw",
"license": "4DFLK",
"specs": [
{
"properties": [
{
"info": [
"powerful",
"convertable"
]
},
{
"info": [
"drive",
"expensive"
]
}
]
}
],
"description": "amazing car"
}
]
}
]
}
]
我希望得到以下输出:
[
{
"company_name": "GreekNLC",
"metadata": [
{
"name": "Bob",
"details": [
{
"color": "black",
"type": "bmw",
"license": "4DFLK",
"specs": [
{
"properties": [
{
"info": [
"powerful",
"convertable"
]
},
{
"info": [
"sedan",
"germany"
]
},
{
"info": [
"drive",
"expensive"
]
}
]
}
],
"description": "amazing car"
}
]
}
]
}
]
到目前为止我的代码,
headers = ['color', 'license', 'type', 'description']
def _key(d):
return [d.get(i) for i in headers]
def get_specs(b):
_specs = [c['properties'] for i in b for c in i['specs']]
return [{"properties": [i for b in _specs for i in b]}]
def merge(d):
new_merged_list = [[a, list(b)] for a, b in groupby(sorted(d, key=_key), key=_key)]
k = [{**dict(zip(headers, a)), 'specs': get_specs(b)} for a, b in new_merged_list]
return k
result = {'name': merge(c.get("details")) for i in data for c in i.get("metadata")}
print(json.dumps(result))
但它不起作用。我收到了这个
{"name": [{"color": "black", "specs": [{"properties": [{"info":
["amazing", "strong"]}]}]}]}
【问题讨论】:
-
ast.literal_evalmetod 需要一个字符串 arg,您正在传递一个列表对象。你刚刚纠正了它:) -
是的,但我仍然没有看到上面的预期输出。你能帮忙吗@scriptmonster