循环使用Python中的无限嵌套字典

伊格纳西奥·米兰(IgnacioMillán)

我在Python中有一个数据结构,可以有无限的嵌套字典和列表,这是一个模型:

payload={
   "mimeType":"multipart",
   "parts":[
     {
     "mimeType":"multipart",
     "parts":[
         {
            "mimeType":"multipart",
            "parts":[
              {
                "mimeType":"text",
                "body":"ACTUAL CONTENT"
              }
            ]
         },
         {
            "mimeType":"text",
            "body":"ACTUAL CONTENT"

         }
       ]
     },
     {
         "mimeType":"text",
         "body":"ACTUAL CONTENT"
     }
   ]
}

如果您有兴趣,这是Gmail API(简化版)提供的电子邮件。

目的是创建一个包含mimeType =“ text”的每个部分的列表,该列表可以包含在任意数量的带有mimeType =“ multipart”的部分中。

预期结果:

[
     {
         mimeType: "text"
         body: "ACTUAL CONTENT"
     },
     {
         mimeType: "text"
         body: "ACTUAL CONTENT"
     },
     ...
]

我已经通过使用无限循环并通过中断来控制它来达成一个解决方案:

i = 0
while True:
    try:
        if payload["parts"][i]["mimeType"] == "multipart":
            # Add nested parts to the main payload
            payload["parts"].append(payload["parts"][i]["parts"])
            # Remove this part from main payload
            message["payload"]["parts"].pop(i) 
        i = i + 1
    except IndexError:
        break

但我认为应该有Python或更合理的方法。

阿玛丹

确实,递归是关键。如果我们有文字,那么只需将整个内容作为一个元素返回即可;如果我们有一个多部分,则将其各部分的所有文本位加起来。

def find_text_bits(payload):
    if payload['mimeType'] == 'multipart':
        return [part_text
                for part in payload['parts']
                for part_text in find_text_bits(part)]
    elif payload['mimeType'] == 'text':
        return [payload]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章