Python 创建可能组合列表的列表

Python 创建可能组合列表的列表,python,Python,我有一份清单,其中包含以下项目: initl = [1, 2, 3, 4] 和步长,即步长=0.05。允许通过步长向上或向下更改列表中的每个值。我想创建的是一个列表列表,其中包含向上、向下或初始值的所有组合,例如: result_list = [[1, 2, 3, 4], [1.05, 2, 3, 4], [0.95, 2, 3, 4], [1, 2.05, 3, 4], ...] 列表中组合的顺序并不重要 我想到了这个: import itertools initl = [1, 2,

我有一份清单,其中包含以下项目:

initl = [1, 2, 3, 4]
步长
,即
步长=0.05
。允许通过
步长向上或向下更改列表中的每个值。我想创建的是一个列表列表,其中包含向上、向下或初始值的所有组合,例如:

result_list = [[1, 2, 3, 4], [1.05, 2, 3, 4], [0.95, 2, 3, 4], [1, 2.05, 3, 4], ...] 
列表中组合的顺序并不重要

我想到了这个:

import itertools


initl = [1, 2, 3, 4]
stepsize = 0.05

lu = [i + stepsize for i in initl]
ld = [i - stepsize for i in initl]

l_map = list(itertools.product(range(3), repeat=4))

result_list = []

for i in l_map:
    l_new = []
    for pos, j in enumerate(i):
        if j == 0:
            l_new.append(ld[pos])
        elif j == 1:
            l_new.append(initl[pos])
        else:
            l_new.append(lu[pos])
   result_list.append(l_new)
它产生所需的输出。列表长度:3^4=81。
但我想知道是否有更好的方法。这里嵌套的for循环对我来说特别笨重。感谢您的帮助。

对于三选一的案例,您的想法是正确的,基本上是自己实现的

您可以直接在包含每个值的所有选项元组的列表上使用
itertools.product
,如下所示:

导入itertools
initl=[1,2,3,4]
步长=0.05
prod_seed=[(i,i+步长,i-stepsize)表示初始值中的i]
结果列表=列表(itertools.product(*prod\u seed))
打印(结果列表)
打印(len(结果列表))
输出:

[(1, 2, 3, 4), (1, 2, 3, 4.05), (1, 2, 3, 3.95), ....]
81
尝试:

def getComb(arr,step,res=[]):
如果(len(arr)==1):
对于[-步骤,0,步骤]中的el:
收益率res+[arr[0]+el]
其他:
对于[-步骤,0,步骤]中的el:
来自getComb的产量(arr[1:],步长,res+[arr[0]+el])
对于您的输入数据输出:

getComb中el的
>(初始,步长):打印(el)
[0.95, 1.95, 2.95, 3.95]
[0.95, 1.95, 2.95, 4]
[0.95, 1.95, 2.95, 4.05]
[0.95, 1.95, 3, 3.95]
[0.95, 1.95, 3, 4]
...
[1.05, 2.05, 3, 4]
[1.05, 2.05, 3, 4.05]
[1.05, 2.05, 3.05, 3.95]
[1.05, 2.05, 3.05, 4]
[1.05, 2.05, 3.05, 4.05]

您可以尝试下面这样的列表理解,
zip
使用
initl
产品进行编码:

>>> from itertools import product
>>> initl = [1, 2, 3, 4]
>>> step = [-0.05, 0, 0.05]
>>> [[x+d for x, d in zip(initl, p)] for p in product(step, repeat=len(initl))]
[[0.95, 1.95, 2.95, 3.95],
 [0.95, 1.95, 2.95, 4],
 ...
 [1.05, 2.05, 3.05, 4.05]]
>>> len(_)
81

你快到了。您所需要做的就是转换由3(4个长度)列表组成的矩阵,以便itertools.product可以从
[elem[i]-步长、elem[i]、elem[i]+步长]
中选择每个元素。这是由zip函数完成的

>>根据需要导入itertools
>>>
>>>initl=[1,2,3,4]
>>>步长=0.05
>>>
>>>lo=[elem-初始中elem的步长]
>>>hi=[elem+初始中elem的步长]
>>>你好
([0.95, 1.95, 2.95, 3.95], [1.05, 2.05, 3.05, 4.05])
>>>
>>>列表(it.product(*zip(lo、initl、hi)))
[(0.95, 1.95, 2.95, 3.95), (0.95, 1.95, 2.95, 4), (0.95, 1.95, 2.95, 4.05), (0.95, 1.95, 3, 3.95), (0.95, 1.95, 3, 4), (0.95, 1.95, 3, 4.05), (0.95, 1.95, 3.05, 3.95), (0.95, 1.95, 3.05, 4), (0.95, 1.95, 3.05, 4.05), (0.95, 2, 2.95, 3.95), (0.95, 2, 2.95, 4), (0.95, 2, 2.95, 4.05), (0.95, 2, 3, 3.95), (0.95, 2, 3, 4), (0.95, 2, 3, 4.05), (0.95, 2, 3.05, 3.95), (0.95, 2, 3.05, 4), (0.95, 2, 3.05, 4.05), (0.95, 2.05, 2.95, 3.95), (0.95, 2.05, 2.95, 4), (0.95, 2.05, 2.95, 4.05), (0.95, 2.05, 3, 3.95), (0.95, 2.05, 3, 4), (0.95, 2.05, 3, 4.05), (0.95, 2.05, 3.05, 3.95), (0.95, 2.05, 3.05, 4), (0.95, 2.05, 3.05, 4.05), (1, 1.95, 2.95, 3.95), (1, 1.95, 2.95, 4), (1, 1.95, 2.95, 4.05), (1, 1.95, 3, 3.95), (1, 1.95, 3, 4), (1, 1.95, 3, 4.05), (1, 1.95, 3.05, 3.95), (1, 1.95, 3.05, 4), (1, 1.95, 3.05, 4.05), (1, 2, 2.95, 3.95), (1, 2, 2.95, 4), (1, 2, 2.95, 4.05), (1, 2, 3, 3.95), (1, 2, 3, 4), (1, 2, 3, 4.05), (1, 2, 3.05, 3.95), (1, 2, 3.05, 4), (1, 2, 3.05, 4.05), (1, 2.05, 2.95, 3.95), (1, 2.05, 2.95, 4), (1, 2.05, 2.95, 4.05), (1, 2.05, 3, 3.95), (1, 2.05, 3, 4), (1, 2.05, 3, 4.05), (1, 2.05, 3.05, 3.95), (1, 2.05, 3.05, 4), (1, 2.05, 3.05, 4.05), (1.05, 1.95, 2.95, 3.95), (1.05, 1.95, 2.95, 4), (1.05, 1.95, 2.95, 4.05), (1.05, 1.95, 3, 3.95), (1.05, 1.95, 3, 4), (1.05, 1.95, 3, 4.05), (1.05, 1.95, 3.05, 3.95), (1.05, 1.95, 3.05, 4), (1.05, 1.95, 3.05, 4.05), (1.05, 2, 2.95, 3.95), (1.05, 2, 2.95, 4), (1.05, 2, 2.95, 4.05), (1.05, 2, 3, 3.95), (1.05, 2, 3, 4), (1.05, 2, 3, 4.05), (1.05, 2, 3.05, 3.95), (1.05, 2, 3.05, 4), (1.05, 2, 3.05, 4.05), (1.05, 2.05, 2.95, 3.95), (1.05, 2.05, 2.95, 4), (1.05, 2.05, 2.95, 4.05), (1.05, 2.05, 3, 3.95), (1.05, 2.05, 3, 4), (1.05, 2.05, 3, 4.05), (1.05, 2.05, 3.05, 3.95), (1.05, 2.05, 3.05, 4), (1.05, 2.05, 3.05, 4.05)]

非常有趣的方法!谢谢!你是对的,后面的部分本质上是
np。选择
。感谢各位给出的惊人答案。我特别喜欢Grzegorz Skibinski的递归生成器方法。其他人的答案彼此相似,但我决定接受Adam.Er8的答案。