围绕一个点的实验组合表

问题描述 投票:0回答:1

我正在尝试用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]
                 ]
python python-3.x itertools
1个回答
0
投票

这不需要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')
© www.soinside.com 2019 - 2024. All rights reserved.