python - 将有序字典列表转换为具有多个值的嵌套列表

标签 python list dictionary

With respect to this questionthis answer ,我还有一些详细信息的疑问。所以在这里我更新我的问题

现在数据是这样的;

[OrderedDict([('caseId', 20), ('userId', 1), ('userName', 'user1'), ('emailStatus', 21), ('emailBody' , 'body')]), 
 OrderedDict([('caseId', 20), ('userId', 1), ('userName', 'user1'), ('emailStatus', 20), ('emailBody' , 'body')]), 
 OrderedDict([('caseId', 18), ('userId', 4), ('userName', 'user4'), ('emailStatus', 21), ('emailBody' , 'body')]), 
 OrderedDict([('caseId', 19), ('userId', 3), ('userName', 'user3'), ('emailStatus', 21), ('emailBody' , 'body')]), 
 OrderedDict([('caseId', 18), ('userId', 1), ('userName', 'user1'), ('emailStatus', 20), ('emailBody' , 'body')]),
 OrderedDict([('caseId', 20), ('userId', 3), ('userName', 'user3'), ('emailStatus', 21), ('emailBody' , 'body')]),
 OrderedDict([('caseId', 18), ('userId', 4), ('userName', 'user4'), ('emailStatus', 20), ('emailBody' , 'body')]), 
 OrderedDict([('caseId', 19), ('userId', 1), ('userName', 'user1'), ('emailStatus', 20), ('emailBody' , 'body')])]

我想获取嵌套列表的列表,如下所示;

[{
"caseId": "20",
"users": [
  {
    "userId": "1",
    "userName" : "user1",
    "emailStatus": [
      {
      "emailStatus" : "20",
      "emailBody" : "body"
      },
      {
      "emailStatus" : "21",
      "emailBody" : "body"
      }

    ]
  },
    {
    "userId": "3",
    "userName" : "user3",
    "emailStatus": [
      {
      "emailStatus" : "21",
      "emailBody" : "body"
      }

    ]

  }
]
},
{
"caseId": "19",
"users": [
  {
    "userId": "1",
    "userName" : "user1",
    "emailStatus": [
      {
      "emailStatus" : "20",
      "emailBody" : "body"
      }
    ]

  },
    {
    "userId": "3",
    "userName" : "user3",
    "emailStatus": [
      {
      "emailStatus" : "21",
      "emailBody" : "body"
      }

    ]

  }
]
},
{
"caseId": "18",
"users": [
  {
    "userId": "1",
    "userName" : "user1",
    "emailStatus": [
      {
      "emailStatus" : "20",
      "emailBody" : "body"
      }
    ]

  },
    {
    "userId": "4",
    "emailStatus": [
      {
      "emailStatus" : "20",
      "emailBody" : "body"
      },
      {
      "emailStatus" : "21",
      "emailBody" : "body"
      }

    ]

  }
]
}
]

呈现这样的嵌套列表;

enter image description here

我尝试做这样的事情

temp.setdefault(d["caseId"], {}).setdefault(str(d["userId"])+str(d["userName"]),[])

但它是将 UserIdUserName 连接起来,而不是创建新对象。请猜猜??

最佳答案

您可以创建这两个字段的元组,并将其用作 key,而不是将 userIduserName 字段连接到一个字符串temp 字典。 statusbody 相同:

temp = {}
for d in lst:
    temp.setdefault(d["caseId"], {}).setdefault((d["userId"], d["userName"]), []).append((d["emailStatus"], d["emailBody"]))
print(temp)
# {18: {(1, 'user1'): [(20, 'body')], (4, 'user4'): [(21, 'body'), (20, 'body')]},
#  19: {(3, 'user3'): [(21, 'body')], (1, 'user1'): [(20, 'body')]},
#  20: {(3, 'user3'): [(21, 'body')], (1, 'user1'): [(21, 'body'), (20, 'body')]}}

或者使用defaultdict:

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

然后使用 for (uid, uname), status in ... 再次解压这些元组

res = [{"caseId": case, "users": [{"userId": uid, "userName": uname, "emailStatus": [{"emailStatus": s, "emailBody": b}
                                                                                     for (s, b) in status]} 
                                  for (uid, uname), status in users.items()]} 
       for case, users in temp.items()]
print(res)
# [{'users': [{'userName': 'user1', 'userId': 1, 'emailStatus': [{'emailBody': 'body', 'emailStatus': 20}]}, {'userName': 'user4', 'userId': 4, 'emailStatus': [{'emailBody': 'body', 'emailStatus': 21}, {'emailBody': 'body', 'emailStatus': 20}]}], 'caseId': 18},
#  {'users': [{'userName': 'user3', 'userId': 3, 'emailStatus': [{'emailBody': 'body', 'emailStatus': 21}]}, {'userName': 'user1', 'userId': 1, 'emailStatus': [{'emailBody': 'body', 'emailStatus': 20}]}], 'caseId': 19},
#  {'users': [{'userName': 'user3', 'userId': 3, 'emailStatus': [{'emailBody': 'body', 'emailStatus': 21}]}, {'userName': 'user1', 'userId': 1, 'emailStatus': [{'emailBody': 'body', 'emailStatus': 21}, {'emailBody': 'body', 'emailStatus': 20}]}], 'caseId': 20}]

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

相关文章:

python - 如何在笔记本选项卡pygtk中获取输入字段作为密码(*)

python - 从嵌套列表和元组列表中获取所有唯一字符串

填充通用列表时出现 java.lang.NullPointerException

c# - 用文本框中的数字填充字典并将文本框作为键

python - numpy 矩阵的映射索引

python - 提高 Python 中非常大的列表的计数速度/性能

python - 如何从 Cerberus 验证失败的文档中删除字段?

python - 如何让 PyC​​harm 在其控制台中显示 unicode 数据?

python - 将列表与列表列表连接起来

python - 从文本文件读入 python 列表