首页 > 解决方案 > Python参数化列表中的所有组合

问题描述

大家好,我需要从参数列表中获取所有可能的组合。

例如,我们可以有一个带参数的列表,其中:

这是我的代码

from typing import List

class Parameter:
  def __init__ (self, value = None, lowLimit = None, hightLimit = None, step = None):
    self.value = value
    self.lowLimit = lowLimit
    self.hightLimit = hightLimit
    self.step = step

data: List[Parameter]  = [Parameter(1), Parameter(2, 2, 3, 1), Parameter(3, 3, 4, 1)]

def recursion(array: List[Parameter], skip: int):
  for index, value in enumerate(array):
    if index < skip: continue
    if value.lowLimit is not None and value.hightLimit is not None:
      temp = [it.value for it in array]
      init = value.lowLimit

      while init <= value.hightLimit :
        temp[index] = init
        init += value.step
        yield temp

def combination(array: List[Parameter]):
  for index, value in enumerate(array):
    if value.lowLimit is None and value.hightLimit is None : continue
    for d in recursion(array, index):
      yield d


for d in combination(data):
  print(d)

这就是我想要得到的:

[1, 2, 3]
[1, 2, 4]
[1, 2, 5]
[1, 3, 3]
[1, 2, 3]
[1, 3, 3]

但我的代码不起作用,我需要一些帮助来实现这个任务。有人可以帮忙吗?

标签: pythonmathcombinations

解决方案


不确定我是否真的理解您的要求,但我认为您可以将您的转换Parametersranges然后获取以下itertools.product内容:

import itertools
data = [Parameter(1), Parameter(2, 2, 3, 1), Parameter(3, 3, 5, 2)]
ranges = [[p.value] if p.lowLimit is None else
          range(p.lowLimit, p.hightLimit+1, p.step) for p in data]
print(ranges)
# [[1], range(2, 4), range(3, 6, 2)]
for d in itertools.product(*ranges):
    print(d)
# (1, 2, 3), (1, 2, 5), (1, 3, 3), (1, 3, 5)

(注意:输出有所不同,因为我将其更改data为实际使用 a step != 1


推荐阅读