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

时间:2018-10-17 08:19:35

标签: python

我在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

但是我认为应该有一种 Pythonic 或至少更合适的方法来实现它。

2 个答案:

答案 0 :(得分:1)

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

def Q3(a):
    lst = [i * i for i in sorted(a)]
    ans = 0
    for x in range(len(lst) - 2):
        y = x + 1
        z = y + 1
        while z < len(lst):
            while z < len(lst) and lst[z] < lst[x] + lst[y]:
                z += 1
            if z < len(lst) and lst[z] == lst[x] + lst[y]:
                ans += 1
            y += 1
    return ans

答案 1 :(得分:1)

您可以创建自己的public Transform TurnOffShield; TurnOffShield = GameObject.Find("Shields").transform; 函数。如果找到具有recursive属性等于mimeType的对象,则必须将其添加到text list 中。否则,您应该result在子嵌套对象中。

search

输出

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

def search(payload, result):
  for i in range(0, len(payload['parts'])):
    item = payload['parts'][i]
    result.append(item) if item['mimeType'] == 'text' else search(item, result)
  return result

result = search(payload, [])