【发布时间】:2019-08-22 10:47:42
【问题描述】:
我正在就以下问题寻求帮助。我有一个小程序,它是一个更大程序的一部分,我需要以与 itertools 相同的方式遍历从 1 到 10(可能或多或少)的数字数组的每个组合。但是,由于我有某些限制,我需要跳过大量这些组合以节省时间,因为这可能会变得非常大。
这是我的程序
combination = [-1, -1, -1, -1]
len_combination = len(combination)
max_at_index = [0, 2, 2, 1, 2, 1, 2, 1, 3, 1]
len_index = len(max_at_index)
end = 0
def skip(depth):
combination[depth] = combination[depth] + 1
if combination[depth] == len_index:
combination[depth] = 0
for x in range(0, len_index):
if combination[:depth + 1].count(x) > max_at_index[x]:
return True
return False
for i in range(0, len_index):
if skip(0):
continue
for j in range(0, len_index):
if skip(1):
continue
for k in range(0, len_index):
if skip(2):
continue
for l in range(0, len_index):
if skip(3):
continue
print(combination)
这个例子有 4 个项目,每个项目从 0 到 9 循环,([0, 0, 0, 0] 到 [9, 9, 9, 9])。但是,我的变量 max_at_index 限制了数组中每个索引处允许的值的计数。这里我们允许 0 0、2 1、2 2、1 3 等。这很好用,我什至可以扩展或缩小 max_at_index 数组。
我不知道该怎么做是使嵌套的 for 循环递归,这样我就可以扩展或缩小组合的大小以包含更多或更少的元素。
提前谢谢你。
编辑: 根据要求,对我的逻辑进行一些解释
考虑以下成本清单
[
[1, 2, 3, 4, 5, 6, 0, 8, 9],
[10, 11, 12, 0, 14, 15, 16, 17, 18, 19],
[0, 21, 22, 23, 24, 25, 26, 27, 28, 29],
[30, 0, 32, 33, 34, 35, 0, 37, 38, 0]
]
从每个数组中选择一个数字时,我必须生成尽可能小的总数...
- 每个数组的数字不能为0
- 每个所选数字的索引不能超过给定的限制(即索引 2 中不超过 3)
- 从索引 0 中选择的数字数量必须达到限制(对于 示例 2 必须来自索引 0) 或下一个可能的最高值。
这部分我也想通了。如果我循环从 0,0,0,0 到 9,9,9,9 的每一个可能的组合,我可以测试它是否符合上述条件。我只需要避免循环每个组合,因为它们中的大多数都是无用的,而且会变大
【问题讨论】:
-
你在循环中哪里使用 i,j,k,l ?
-
订单对您来说重要吗?也就是说,您是否需要生成例如
(0, 2, 1, 2)和(2, 2, 1, 0)作为不同的组合,或者不应该生成具有相同元素的元组? -
当我第一次写这个的时候,skip 函数是每个循环的一部分,而不是一个函数,它们在那里被使用并且现在是多余的
-
重复很重要,每个组合都指向另一个数组中的索引。我有一个由 4 个数组组成的数组,每个数组有 10 个元素。这会从这些数组中构建每个值的组合(4 个中的 1 个)
-
我还是建议结合正确的参数使用 itertools(可能多次调用它的函数)。这样,您不仅可以设置偏移量,还可以设置限制。您还可以使用 itertools 生成组合,然后使用您的自定义约束过滤它的输出。
标签: python loops for-loop recursion