我有一本带有变量的字典:
variables = {
'a': ['x','y','z'],
'b': [1,2,3,4],
'c': ['xx','yy','zz']
}
对于每个可能的变量组合,我想制作一个单独的场景,如下所示:
scenarios = {
1: {a: 'x', b: 1, c: 'xx'},
2: {a: 'y', b: 1, c: 'xx'},
3: {a: 'z', b: 1, c: 'xx'},
4: {a: 'x', b: 2, c: 'xx'},
5: {a: 'y', b: 2, c: 'xx'},
6: {a: 'z', b: 2, c: 'xx'},
7: {a: 'x', b: 3, c: 'xx'},
8: {a: 'y', b: 3, c: 'xx'},
9: {a: 'z', b: 3, c: 'xx'},
.. }
如何做到这一点?
最佳答案
您可以使用 zip
的嵌套字典组合, enumerate
,和itertools.product
.
>>> {i: {n: v for n, v in zip(names, p)}
... for names, values in [zip(*variables.items())]
... for i, p in enumerate(itertools.product(*values), start=1)}
...
{1: {'a': 'x', 'b': 1, 'c': 'xx'},
2: {'a': 'x', 'b': 2, 'c': 'xx'},
3: {'a': 'x', 'b': 3, 'c': 'xx'},
...
36: {'a': 'z', 'b': 4, 'c': 'zz'}}
不过,这会以不同的顺序生成项目。如果您想要精确的顺序,您可以在计算产品之前对项目进行反向排序:
>>> {i: {n: v for n, v in zip(names, p)}
... for names, values in [zip(*sorted(variables.items(), reverse=True))]
... for i, p in enumerate(itertools.product(*values), start=1)}
...
{1: {'a': 'x', 'b': 1, 'c': 'xx'},
2: {'a': 'y', 'b': 1, 'c': 'xx'},
3: {'a': 'z', 'b': 1, 'c': 'xx'},
...
两者都适用于任意数量的变量
。
关于python - 在Python中通过乘以其他字典来创建字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48956985/