考虑嵌套字典:
d1 = {'key': {'r1': [1,2,3],
'r2': [5,6]} }
我想从上面的字典中提取字典列表,该字典采用嵌套字典列表项的所有组合。例如,对于上面的字典,我想要这样:
ans = [ {'root': 'key', 'r1': 1, 'r2':5},
{'root': 'key', 'r1': 1, 'r2':6},
{'root': 'key', 'r1': 2, 'r2':5},
{'root': 'key', 'r1': 2, 'r2':6},
{'root': 'key', 'r1': 3, 'r2':5},
{'root': 'key', 'r1': 3, 'r2':6}
]
对于上面的示例,我可以手动执行此操作,但问题是d1中除“ root”以外的键数可以是任意变量,并且我的答案会更改,例如,考虑:
d2 = {'key': {'r1': [1,2,3],
'r2': [5,6],
'r3': [7,8]}
}
现在答案将如下所示:
ans = [ {'root': 'key', 'r1': 1, 'r2':5, 'r3':7},
{'root': 'key', 'r1': 1, 'r2':6, 'r3':8},
{'root': 'key', 'r1': 2, 'r2':5, 'r3':7},
{'root': 'key', 'r1': 2, 'r2':6 ,'r3':8},
.
.(total 12 combinations)
]
我可以使用itertools.product在可变数量的列表中查找项目组合,如下所示:
from itertools import product
list(product(d1['key']['r1'], d1['key']['r2']))
返回:
[(1, 5), (1, 6), (2, 5), (2, 6), (3, 5), (3, 6)]
但是如何将对应的密钥添加到这些项目中的每一个中,又如何动态地执行呢?
答案 0 :(得分:1)
只要“根”保持不变,您就可以将itertools.product
和zip
每个产品与字典键一起使用:
>>> from itertools import product
>>> combinations = product(*d2['key'].values())
>>> [{'root': 'key', **dict(zip(d2['key'].keys(), c))} for c in combinations]
[{'r1': 1, 'r2': 5, 'r3': 7, 'root': 'key'},
{'r1': 1, 'r2': 5, 'r3': 8, 'root': 'key'},
{'r1': 1, 'r2': 6, 'r3': 7, 'root': 'key'},
{'r1': 1, 'r2': 6, 'r3': 8, 'root': 'key'},
...
值得庆幸的是,dict.keys()
和dict.values()
会以相应的顺序返回键和值,无论您的python版本如何,规范均对此予以保证。