Nul*_*ter 3 python dictionary list
我列出了有序的dict,其中包括数据中的一些重复的ID ...这样的事情
[OrderedDict([('caseId', 20), ('userId', 1), ('emailStatus', 21)]),
OrderedDict([('caseId', 20), ('userId', 1), ('emailStatus', 20)]),
OrderedDict([('caseId', 18), ('userId', 4), ('emailStatus', 21)]),
OrderedDict([('caseId', 19), ('userId', 3), ('emailStatus', 21)]),
OrderedDict([('caseId', 18), ('userId', 1), ('emailStatus', 20)]),
OrderedDict([('caseId', 20), ('userId', 3), ('emailStatus', 21)]),
OrderedDict([('caseId', 18), ('userId', 4), ('emailStatus', 20)]),
OrderedDict([('caseId', 19), ('userId', 1), ('emailStatus', 20)])]
Run Code Online (Sandbox Code Playgroud)
我想得到一个嵌套列表列表,就像这样;
[{
"caseId": "20",
"users": [
{
"userId": "1",
"emailStatus": [
{
"emailStatus" : "20"
},
{
"emailStatus" : "21"
}
]
},
{
"userId": "3",
"emailStatus": [
{
"emailStatus" : "21"
}
]
}
]
},
{
"caseId": "19",
"users": [
{
"userId": "1",
"emailStatus": [
{
"emailStatus" : "20"
}
]
},
{
"userId": "3",
"emailStatus": [
{
"emailStatus" : "21"
}
]
}
]
},
{
"caseId": "18",
"users": [
{
"userId": "1",
"emailStatus": [
{
"emailStatus" : "20"
}
]
},
{
"userId": "4",
"emailStatus": [
{
"emailStatus" : "20"
},
{
"emailStatus" : "21"
}
]
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
呈现这样的嵌套列表;
我试图通过迭代两个列表来实现这一点,但无法知道如何记录上一个和下一个记录以及相同的数据..这太令人困惑了......如果有人能给我一个开头,我可以如何迭代我的列表,你真好.
很多问候..
更新的问题
首先,您可以使用循环并将dict.setdefault数据分组到嵌套的dict中:
temp = {}
for d in lst:
temp.setdefault(d["caseId"], {}).setdefault(d["userId"], []).append(d["emailStatus"])
print(temp)
# {18: {1: [20], 4: [21, 20]}, 19: {1: [20], 3: [21]}, 20: {1: [21, 20], 3: [21]}}
Run Code Online (Sandbox Code Playgroud)
或者使用collections.defaultdict:
temp = defaultdict(lambda: defaultdict(list))
for d in lst:
temp[d["caseId"]][d["userId"]].append(d["emailStatus"])
Run Code Online (Sandbox Code Playgroud)
然后,使用嵌套的混合字典和列表推导来聚合最终结果:
res = [{"caseId": case, "users": [{"userId": user, "emailStatus": [{"emailStatus": s} for s in status]}
for user, status in users.items()]}
for case, users in temp.items()]
print(res)
# [{'caseId': 18, 'users': [{'userId': 1, 'emailStatus': [{'emailStatus': 20}]}, {'userId': 4, 'emailStatus': [{'emailStatus': 21}, {'emailStatus': 20}]}]},
# {'caseId': 19, 'users': [{'userId': 1, 'emailStatus': [{'emailStatus': 20}]}, {'userId': 3, 'emailStatus': [{'emailStatus': 21}]}]},
# {'caseId': 20, 'users': [{'userId': 1, 'emailStatus': [{'emailStatus': 21}, {'emailStatus': 20}]}, {'userId': 3, 'emailStatus': [{'emailStatus': 21}]}]}]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
440 次 |
| 最近记录: |