【发布时间】:2016-11-24 15:38:00
【问题描述】:
所以我有一个名为 dict1 的列表嵌套字典,如下所示:
{"types": [{"name": "Chinese",
"sub":
[{
"menu": [{"name": "Ya", "cost": 1}, {"name": "Ja", "cost": 2}],
"name": "Soups"
},
{
"menu": [{"name": "Ta", "cost": 3}, {"name": "Ba", "cost": 4}],
"name": "Mains"
}]
},
{"name": "Indian(Mains)",
"menu": [{"name": "Sa", "cost": 5}, {"name": "Pa", "cost": 6}]
}
]
}
我最终需要的是:
{"types": [{"name": "Chinese(Soups)",
"menu": [{"name": "Ya", "cost": 1}, {"name": "Ja", "cost": 2}]},
{"name": "Chinese(Mains)",
"menu": [{"name": "Ta", "cost": 3}, {"name": "Ba", "cost": 4}]},
{"name": "Indian(Mains)",
"menu": [{"name": "Sa", "cost": 5}, {"name": "Pa", "cost": 6}]}
]
}
总而言之,如果内部字典包含 sub 键,请将其分成单独的字典,否则保持原样。由于我最了解的原因,我对此使用列表推导。这是我到目前为止所拥有的:
dict1['types'] = [{'name': '%s(%s)' % (outer['name'], inner['name']),
'menu': inner['menu']}
for outer in dict1['types']
if 'sub' in outer
for inner in outer['sub']]
这给了我以下输出:
{"types": [{"name": "Chinese(Soups)",
"menu": [{"name": "Ya", "cost": 1}, {"name": "Ja", "cost": 2}]},
{"name": "Chinese(Mains)",
"menu": [{"name": "Ta", "cost": 3}, {"name": "Ba", "cost": 4}]}
]
}
很明显,它只给了我 2 个 dicts 而不是 3 个,这很明显,因为我没有 else 子句。我的问题是,在这种情况下,如何在具有两个循环的列表理解中使用 else 子句?
编辑 正如 Martijn 在 cmets 中提到的,这对于列表理解是不可能的,我也可以通过修改现有的 dict 来实现这一点的其他方法
【问题讨论】:
-
if在列表理解循环中只能过滤(排除)项目。没有else选项,因为包含一个项目是默认设置。 -
@Martijn Pieters..能否请您告诉我在不创建新字典和修改现有字典的情况下完成此任务的最佳方法是什么?
标签: python python-2.7 list dictionary list-comprehension