使用 Jolt Spec 如何通过使用键反向减少字典列表
Using Jolt Spec how to reverse reduce a list of dictionary by a key using
使用下面的代码,我能够通过一个键映射字典列表
import json
values_list = [{"id" : 1, "user":"Rick", "title":"More JQ"}, {"id" : 2, "user":"Steve", "title":"Beyond"}, {"id" : 1, "user":"Rick", "title":"Winning"}]
result = {}
for data in values_list:
id = data['id']
user = data['user']
title = data['title']
if id not in result:
result[id] = {
'id' : id,
'user' : user,
'books' : {'titles' : []}
}
result[id]['books']['titles'].append(title)
print(json.dumps((list(result.values())), indent=4))
知道 Jolt 规范有多干净,并尝试在代码之外分离模式。
有没有办法使用 Jolt Spec 来达到相同的结果。
结果
[
{
"id": 1,
"user": "Rick",
"books": {
"titles": [
"More JQ",
"Winning"
]
}
},
{
"id": 2,
"user": "Steve",
"books": {
"titles": [
"Beyond"
]
}
}
]
您可以使用三个级别的连续规格
[
{
"operation": "shift",
"spec": {
"*": {
"*": "@(1,id).&",
"title": "@(1,id).books.&s[]"
}
}
},
{
"operation": "shift",
"spec": {
"*": ""
}
},
{
"operation": "cardinality",
"spec": {
"*": {
"id": "ONE",
"user": "ONE"
}
}
}
]
- 在第一个规范中,常见的
id
值由 "@(1,id)."
表达式组合
- 在第二个规范中,删除了最外层对象的整数键(
1
,2
)
- 在上一个规范中,只选择了第一个重复元素
使用下面的代码,我能够通过一个键映射字典列表
import json
values_list = [{"id" : 1, "user":"Rick", "title":"More JQ"}, {"id" : 2, "user":"Steve", "title":"Beyond"}, {"id" : 1, "user":"Rick", "title":"Winning"}]
result = {}
for data in values_list:
id = data['id']
user = data['user']
title = data['title']
if id not in result:
result[id] = {
'id' : id,
'user' : user,
'books' : {'titles' : []}
}
result[id]['books']['titles'].append(title)
print(json.dumps((list(result.values())), indent=4))
知道 Jolt 规范有多干净,并尝试在代码之外分离模式。 有没有办法使用 Jolt Spec 来达到相同的结果。
结果
[
{
"id": 1,
"user": "Rick",
"books": {
"titles": [
"More JQ",
"Winning"
]
}
},
{
"id": 2,
"user": "Steve",
"books": {
"titles": [
"Beyond"
]
}
}
]
您可以使用三个级别的连续规格
[
{
"operation": "shift",
"spec": {
"*": {
"*": "@(1,id).&",
"title": "@(1,id).books.&s[]"
}
}
},
{
"operation": "shift",
"spec": {
"*": ""
}
},
{
"operation": "cardinality",
"spec": {
"*": {
"id": "ONE",
"user": "ONE"
}
}
}
]
- 在第一个规范中,常见的
id
值由"@(1,id)."
表达式组合 - 在第二个规范中,删除了最外层对象的整数键(
1
,2
) - 在上一个规范中,只选择了第一个重复元素