python - 将有序字典列表转换为嵌套列表

标签 python list dictionary

我有一个有序的字典列表,其中包含一些重复的数据。像这样的东西

[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

最佳答案

首先,您可以使用循环和 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"])

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

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}]}]}]

关于python - 将有序字典列表转换为嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48166852/

相关文章:

c# - 将具有匹配属性的对象分组到列表中

python - Python 3 中列表操作从左到右的应用

hibernate - 如何在hibernate中查询@MapKeyJoinColumn

java - Map 和 Hashmap 有区别吗?

string - 垃圾回收和Go中指针的正确用法

python - pyqt。你怎么知道 QGraphicsScene 中对象的类型?

python - 在 python 2.6 中解析 xhtml

python - Matplotlib - 向图例行添加标题

r - 使用对象名称作为R中的列表名称

python - 如何使用 tweepy 将 python panda 数据帧保存在 csv 文件中