python - 在Python中通过乘以其他字典来创建字典

标签 python dictionary

我有一本带有变量的字典:

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/

相关文章:

python - 正则表达式可在更多条件下匹配版权声明中的公司名称

python - 从文件读取并作为字典返回的函数?

Python:将文本文件的行转换并连接到具有列表值的字典中

python - 定义typing.Dict和dict之间的区别?

使用队列列表的 Python 多处理

python - 如何保持导入轻量级并且仍然正确键入注释?

python - 使用 python 最通用的列映射

python - 如何读取describe_stack输出属性

python - 如何将函数的单独字典输出合并到一个字典中?

python - Python 字典中的求和值?