小编典典

列表字典的笛卡尔积

python

我正在尝试编写一些代码来测试一堆输入参数的笛卡尔积。

我看过了itertools,但是它的product功能并不是我想要的。有没有一种简单明了的方法来获取一个字典,每个字典中包含任意数量的键
每个值中任意数量的元素,然后生成具有下一个排列的字典?

输入:

options = {"number": [1,2,3], "color": ["orange","blue"] }
print list( my_product(options) )

输出示例:

[ {"number": 1, "color": "orange"},
  {"number": 1, "color": "blue"},
  {"number": 2, "color": "orange"},
  {"number": 2, "color": "blue"},
  {"number": 3, "color": "orange"},
  {"number": 3, "color": "blue"}
]

阅读 225

收藏
2020-12-20

共1个答案

小编典典

好的,感谢@dfan告诉我我在错误的位置查看。我现在知道了:

from itertools import product
def my_product(inp):
    return (dict(zip(inp.keys(), values)) for values in product(*inp.values())

编辑
:经过多年的Python经验,我认为一个更好的解决方案是接受kwargs输入,而不是输入字典。呼叫样式与原始呼叫样式更加类似itertools.product。另外,我认为编写生成器函数(而不是返回生成器表达式的函数)会使代码更清晰。所以:

def product_dict(**kwargs):
    keys = kwargs.keys()
    vals = kwargs.values()
    for instance in itertools.product(*vals):
        yield dict(zip(keys, instance))

如果你需要在一个字典来传递,list(product_dict(**mydict))。使用kwargs而不是任意输入类的一个显着变化是,它至少在Python
3.6之前防止键/值被排序。

2020-12-20