python - 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]
但我的代码不起作用,我需要一些帮助来实现这个任务。有人可以帮忙吗?
解决方案
不确定我是否真的理解您的要求,但我认为您可以将您的转换Parameters
为ranges
然后获取以下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
)
推荐阅读
- reactjs - Redux thunk 没有正确重新渲染
- python - 从路径和值创建嵌套字典
- html - 如何根据屏幕大小更改导航栏背景颜色?
- c# - Entity Framework Core 使许多连接处于睡眠状态
- flutter - 如何在 Flutter 中设置方向偏好
- bash - iTerm bash 打开新选项卡并在第二个选项卡中运行命令
- javascript - 如何在反应导航 5 中获取当前路径?
- c++ - 在c ++映射中查找与最大值对应的键
- python-3.x - 如何在python中的字典列表中按值分组?
- azure - 带有数据库的 ASP.Net Core Web 应用程序使用 Visual Studio 2019 发布到 Azure - 实体框架迁移出错