python - 列表的 json 深度排序列表(深度嵌套)- json 具有重复键
问题描述
我正在尝试对列表的 json 列表(等等..可以递归嵌套)进行深度排序,其中 json 可以有重复的键,并且 json 中没有特定的键来排序。
输入:
{"payload": [
{
"a": {
"aa": [
{
"aa12": {
"aaa23": 230,
"aaa21": 210,
"aaa.something": "yes"
}
},
{
"aa11": {
"aaa12": 120,
"aaa11": 110
}
},
{
"aa13": {
"aaa35": 350,
"aaa32": 320,
"aaa.someattr": "true"
}
}
],
"aa": [
{
"aa12": {
"aaa22": 22,
"aaa21": 21
}
},
{
"aa10": {
"aaa03": 3,
"aaa01": 1
}
},
{
"aa13": {
"aaa33": 33,
"aaa32": 32
}
},
{
"aa1": "aab"
}
],
"ac": [
"ac3",
"ac1",
"ac2"
]
}
},
{
"b": {
"bb": [
"bb4",
"bb2",
"bb3",
"bb1"
]
}
}
]}
预期输出:
{"payload": [
{
"a": {
"aa": [
{
"aa1": "aab"
},
{
"aa10": {
"aaa01": 1,
"aaa03": 3
}
},
{
"aa12": {
"aaa21": 21,
"aaa22": 22
}
},
{
"aa13": {
"aaa32": 32,
"aaa33": 33
}
}
],
"aa": [
{
"aa11": {
"aaa11": 110,
"aaa12": 120
}
},
{
"aa12": {
"aaa.something": "yes"
"aaa21": 210,
"aaa23": 230
}
},
{
"aa13": {
"aaa.someattr": "true",
"aaa32": 320,
"aaa35": 350
}
}
],
"ac": [
"ac1",
"ac2",
"ac3"
]
}
},
{
"b": {
"bb": [
"bb1",
"bb2",
"bb3",
"bb4"
]
}
}
]}
我尝试使用以下递归方法:
ls = {'payload': [{'a': {'aa': [{'aa12': {'aaa23': 230, 'aaa21': 210}}, {'aa11': {'aaa12': 120, 'aaa11': 110}}, {'aa13': {'aaa35': 350, 'aaa32': 320}}], 'ac': ['ac3', 'ac1', 'ac2'], 'aa': [{'aa12': {'aaa22': 22, 'aaa21': 21}}, {'aa10': {'aaa03': 3, 'aaa01': 1}}, {'aa13': {'aaa33': 33, 'aaa32': 32}}, {'aa1': 'aab'}]}}, {'b': {'bb': ['bb4', 'bb2', 'bb3', 'bb1']}}]}
output = sorted_deep(ls)
print(output)
def sorted_deep(d):
if isinstance(d,list):
return sorted(sorted_deep(v) for v in d)
if isinstance(d,dict):
return {k: sorted_deep(d[k]) for k in sorted(d)}
return d
但这行不通。它在排序时用最后找到的值覆盖重复键的值。由于重复键可以是任何字符串,我们不能通过指定键名来进行迭代。我正在寻找一种通用解决方案,它可以对任何给定的复杂 json 列表进行排序 - 使用嵌套列表/json。
我的最终目标是深度匹配 2 个这样的 JSON 以找出差异。
解决方案
考虑使用 sorted()
sorted(paymentsByAgreeement[agreement['agreementId']],key=lambda i:
(i['eventDate'],i['id']))
在此处阅读有关 sorted 和 lambda 的信息https://wiki.python.org/moin/HowTo/Sorting with lambda,您可以访问子元素以更深入地了解您可能需要一个 for 和另一个带有 sorted 的 lambda
推荐阅读
- excel - 仅当给定值出现在 Excel 的另一列中时如何替换值
- javascript - 兄弟组件Vue.js之间的通信仅在插入时更改卡片的视图?
- sql - 使用 oracle SQL 查询生成字母序列
- c++ - 浮点数上的自定义和标准 fetch_add 的差异
- javascript - 通过 javascript 操作 DOM 时在表格的特定部分显示项目
- python - 为什么 Keras 在 model.evaluate、model.predicts 和 model.fit 之间给出不同的结果?
- flutter - 从 List LatLng flutter dart 编码折线
- multithreading - Kubernetes 中的 Millicores 多线程
- r - 计算每个组 i 数据帧的分位数并分配 NA?
- express - JOI 验证中的 stripUnknown 有什么作用?