我正在尝试用Python中的itertools
模块解决问题。不幸的是我无法解决,我在这里寻求帮助
想象我们想做一个实验,我们有四个不同的因素分别命名为:
[a,b,c,d]
例如,每个因子可以在4个不同的值附近更改:
a=[a1=10,a2=20,a3=30]
现在看看更改因子的影响是什么,我只想将一个值更改为一。
如何获得所有可能组合的列表?
因此,对于这个小例子,我正在搜索以创建下表:
[[a1,b1,c1,d1]
[a1,b1,c1,d2]
[a1,b1,c1,d3]
[a1,b1,c1,d4]
[a1,b1,c2,d1]
[a1,b1,c3,d1]
[a1,b1,c4,d1]
[a1,b2,c1,d1]
[a1,b3,c1,d1]
[a1,b4,c1,d1]
[a2,b1,c1,d1]
[a3,b1,c1,d1]
]
这不需要itertools;只需使用嵌套循环即可。外循环选择要改变的因子,内循环则在可能的值上改变它。输入格式是列表的列表,其中每个“行”包含一个因子的可能值,第一个值为其“默认”。
def vary_individual_factors(factors):
r = [f[0] for f in factors]
yield tuple(r)
for i, [first, *rest] in enumerate(factors):
for x in rest:
r[i] = x
yield tuple(r)
r[i] = first
示例:
>>> factors = [
... ['a1', 'a2', 'a3', 'a4'],
... ['b1', 'b2', 'b3', 'b4'],
... ['c1', 'c2', 'c3', 'c4'],
... ['d1', 'd2', 'd3', 'd4']
... ]
...
>>> for t in vary_individual_factors(factors):
... print(t)
...
('a1', 'b1', 'c1', 'd1')
('a2', 'b1', 'c1', 'd1')
('a3', 'b1', 'c1', 'd1')
('a4', 'b1', 'c1', 'd1')
('a1', 'b2', 'c1', 'd1')
('a1', 'b3', 'c1', 'd1')
('a1', 'b4', 'c1', 'd1')
('a1', 'b1', 'c2', 'd1')
('a1', 'b1', 'c3', 'd1')
('a1', 'b1', 'c4', 'd1')
('a1', 'b1', 'c1', 'd2')
('a1', 'b1', 'c1', 'd3')
('a1', 'b1', 'c1', 'd4')