我在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 或至少更合适的方法来实现它。
答案 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, [])