如何用一行代码基于三个列表生成三级嵌套字典?
解决三级嵌套字典的一行代码实现问题
嘿,我来帮你搞定这个问题!首先得纠正下你目标字典里的小语法错误——你写的结构里有多余的括号和重复的键,正确的目标结构应该是每个l1元素对应一个包含所有l2元素的字典,每个l2元素再对应一个包含所有l3元素且值为0的字典,大概是这样:
{ 'a': { '1': {'d': 0, 'e': 0}, '2': {'d': 0, 'e': 0}, '3': {'d': 0, 'e': 0} }, 'b': { '1': {'d': 0, 'e': 0}, '2': {'d': 0, 'e': 0}, '3': {'d': 0, 'e': 0} } }
你之前的代码问题出在两点:
- 用
zip(l1,l2,l3)完全不符合需求:zip是按索引把三个列表的元素一一配对(比如('a','1','d')、('b','2','e')),但你需要的是笛卡尔积式的全组合——每个l1元素要和所有l2元素组合,每个l2元素再和所有l3元素组合。 - 推导式的结构不对,只有一层嵌套,没法生成三级字典,还会导致元素被覆盖。
正确的一行代码可以用三层嵌套的字典推导式实现,完全符合你的需求:
nd = {i: {j: {k: 0 for k in l3} for j in l2} for i in l1}
咱们拆解下这个推导式:
- 最外层:遍历
l1的每个元素i,作为顶级键; - 中间层:每个
i对应一个字典,遍历l2的每个元素j作为第二层键; - 最内层:每个
j对应一个字典,遍历l3的每个元素k作为第三层键,值固定为0。
运行这段代码就能得到你想要的三级嵌套字典啦!
内容的提问来源于stack exchange,提问作者Dnaiel
相关产品推荐
相关产品推荐

