递归生成索引列表-Python

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

我正在尝试生成递增索引的列表,我希望将其用于以后的分析。虽然以下代码可用于生成2个索引的列表,但不适用于任意数量的索引。这是用于生成2个递增索引的列表的代码。

max_len = 9
idxs_len2 = [[idx1, idx2] for idx1 in range(1, max_len) for idx2 in range(idx1 + 1, max_len)]

例如,要生成三个递增索引的列表,我将需要手动将代码更改为以下代码:

idxs_len3 = [
    [idx1, idx2, idx3] 
    for idx1 in range(1, max_len) 
    for idx2 in range(idx1 + 1, max_len) 
    for idx3 in range(idx2 + 1, max_len)
]

因此,目前我无法为任意数量的索引生成递增索引的列表。我以为我可能需要创建一个递归函数来创建具有任意长度的索引列表。尽管我在网上找到了很多有关递归函数的信息,但我无法将其应用于我的特定用例。到目前为止,我所能想到的就是以下内容(它没有产生所需的输出):

def generate_idxs(idx1, all_idxs, max_depth=3, max_len=9):
    current_idxs = []
    for idx2 in range(idx1 + 1, max_len):
        if len(current_idxs) < max_depth:
            current_idxs.append(idx2)
        else:
            all_idxs.append(current_idxs)
            generate_idxs(idx2, all_idxs, max_len=9)

# Calling the function
idxs_len3_test = []
generate_idxs(0, idxs_len3_test, max_len=9)
idxs_len3 == idxs_len3_test # ==> Yields False

有人知道这个问题的答案,还是可以指出正确的方向?感谢您的宝贵时间,我非常感谢。

最好,凯文

编辑:谢谢大家的回答!我可能应该提到,生成元组列表也很好,并且不一定需要一个可以完成此操作的递归函数。我只是以为只有递归函数才有可能,但是我不知道没有递归函数也可以解决我的问题。

python list recursion indices
2个回答
1
投票

如果您专门在寻找递归解决方案,那么这是一种方法。

def generate_idxs(start, all_idxs, current_idxs, max_depth, max_len):
    if len(current_idxs) == max_depth:
        all_idxs.append(current_idxs.copy()) # Add the solution and return
        return
    for i in range(start + 1, max_len):
        current_idxs.append(i) # Add an element to the end
        generate_idxs(i, all_idxs, current_idxs, max_depth, max_len) # Recurse
        current_idxs.pop() # Remove the element at end (Backtrack)
    return

all_idxs = []
generate_idxs(0, all_idxs, [], 4, 6)
print(all_idxs)

输出

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

1
投票

@ iz_的itertools.combinations()解决方案似乎最好(+1)。但是,如果我要递归地编写它,那么我会想重新输入它,没有副作用:

def generate_idxs(max_depth, max_index, start=1):
    if start < max_index:

        if max_depth == 1:
            return [[index] for index in range(start, max_index)]

        return [[start, *index] for index in generate_idxs(max_depth - 1, max_index, start + 1)] + generate_idxs(max_depth, max_index, start + 1)

    return []

print(generate_idxs(4, 6))

输出

> python3 test.py
[[1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 4, 5], [1, 3, 4, 5], [2, 3, 4, 5]]
>

可以轻松修改代码以生成元组列表。

© www.soinside.com 2019 - 2024. All rights reserved.