Python itertools - 只创建所有可能产品的一个子集
Python itertools - Create only a subset of all possible products
我正在编写一个脚本,该脚本使用 itertools 生成给定参数的所需组合。我在生成适当的 'sets' 时遇到问题,但是当某些变量被链接时,即排除某些组合。考虑以下因素:
import itertools
A = ['a1','a2','a3']
B = ['b1','b2','b3']
C = ['c1','c2']
如果我想生成这些元素的所有可能组合,我可以简单地使用 itertools.product()
all_combinations = list(itertools.product(A,B,C))
这给出了预期的
[('a1', 'b1', 'c1'), ('a1', 'b1', 'c2'), ('a1', 'b2', 'c1'), ...
('a3', 'b2', 'c2'), ('a3', 'b3', 'c1'), ('a3', 'b3', 'c2')]
18种组合(3*3*2)
但是,我如何 'link' 参数 A 和 B 使得每个返回的集合仅包含 'an'、'bn' 元素?即我试过:
ABprecombine = zip(A,B)
limited_combinations = list(itertools.product(ABprecombine,C))
哪个returns
[(('a1', 'b1'), 'c1'), (('a1', 'b1'), 'c2'), (('a2', 'b2'), 'c1'),
(('a2', 'b2'), 'c2'), (('a3', 'b3'), 'c1'), (('a3', 'b3'), 'c2')]
这是六个 (3*1*2) 个所需的产品,但显然由于我创建它的方式,我现在有一个额外的元组。
当然我可以生成所有组合,然后过滤掉给定的组合,但是有没有一种聪明的方法可以像上面那样 'link' 参数?
在这里,压缩 A
和 B
是正确的方法。如果需要,您可以很容易地展平元组:
limited_combinations = [(a, b, c) for ((a, b), c) in itertools.product(zip(A, B), C)]
如果您想更详细地控制生成哪些组合,事情可能会迅速变得更加复杂,直到需要解决布尔可满足性等 NP-hard 问题的难度。如果发生这种情况,请查看现有库中的此类内容。
我正在编写一个脚本,该脚本使用 itertools 生成给定参数的所需组合。我在生成适当的 'sets' 时遇到问题,但是当某些变量被链接时,即排除某些组合。考虑以下因素:
import itertools
A = ['a1','a2','a3']
B = ['b1','b2','b3']
C = ['c1','c2']
如果我想生成这些元素的所有可能组合,我可以简单地使用 itertools.product()
all_combinations = list(itertools.product(A,B,C))
这给出了预期的
[('a1', 'b1', 'c1'), ('a1', 'b1', 'c2'), ('a1', 'b2', 'c1'), ...
('a3', 'b2', 'c2'), ('a3', 'b3', 'c1'), ('a3', 'b3', 'c2')]
18种组合(3*3*2)
但是,我如何 'link' 参数 A 和 B 使得每个返回的集合仅包含 'an'、'bn' 元素?即我试过:
ABprecombine = zip(A,B)
limited_combinations = list(itertools.product(ABprecombine,C))
哪个returns
[(('a1', 'b1'), 'c1'), (('a1', 'b1'), 'c2'), (('a2', 'b2'), 'c1'),
(('a2', 'b2'), 'c2'), (('a3', 'b3'), 'c1'), (('a3', 'b3'), 'c2')]
这是六个 (3*1*2) 个所需的产品,但显然由于我创建它的方式,我现在有一个额外的元组。
当然我可以生成所有组合,然后过滤掉给定的组合,但是有没有一种聪明的方法可以像上面那样 'link' 参数?
在这里,压缩 A
和 B
是正确的方法。如果需要,您可以很容易地展平元组:
limited_combinations = [(a, b, c) for ((a, b), c) in itertools.product(zip(A, B), C)]
如果您想更详细地控制生成哪些组合,事情可能会迅速变得更加复杂,直到需要解决布尔可满足性等 NP-hard 问题的难度。如果发生这种情况,请查看现有库中的此类内容。