将有序dict的列表转换为嵌套列表

时间:2018-01-09 11:09:01

标签: python list dictionary

我列出了有序的字典,包括数据中的一些重复的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)])]

我想获得一个嵌套列表列表,类似这样;

[{
"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"
      }

    ]

  }
]
}
]

呈现这样的嵌套列表;

enter image description here

我尝试通过迭代这两个列表来实现这一目标但却无法知道如何记录上一个和下一个记录以及相同的数据......这太令人困惑了......如果有人能给我一个开始我如何迭代我的列表,这将是非常好的你。

很多问候..

更新问题

More detailed question here

1 个答案:

答案 0 :(得分:9)

首先,您可以使用循环和delta将数据分组到嵌套字典中:

dict.setdefault

或使用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]}}

collections.defaultdict

然后,使用嵌套的混合词典和列表推导来聚合最终结果:

temp = defaultdict(lambda: defaultdict(list))
for d in lst:
    temp[d["caseId"]][d["userId"]].append(d["emailStatus"])