python - 列表字典的笛卡尔积

标签 python generator combinatorics

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

我查看了 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"}
]

最佳答案

好的,感谢@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 之前是这样。

关于python - 列表字典的笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5228158/

相关文章:

python - 从特定的行开始,如何进行它们的值直到遇到具有更高值的行?

json - 使用 JSON 键作为嵌套 JSON 中的属性

python - 元组的列表理解为我提供了一个生成器 - 为什么以及如何修改?

python - 如何解释Python中的timeit命令

计算有序和无序排列 - C

python - 在Python中设置最大大小为n的有序分区

java - 在 Java 中从给定的字母表生成所有长度为 N 的单词

python - pygame.mixer.Sound - 无法打开文件

使用traceback.print_exc()打印AttributeError的回溯时出现Python TypeError

python - 为什么这个上下文管理器的行为与字典理解不同?