列出列表1至n的所有组合(给定长度限制k

时间:2020-10-31 17:33:46

标签: python python-3.x

我发现了一个代码,该代码递归返回长度为k的1到n个数字列表的所有组合

def choose_iter(elements, length):
    for i in range(len(elements)):
        if length == 1:
            yield (elements[i],)
    else:
        for next in choose_iter(elements[i+1:len(elements)], length-1):
            yield (elements[i],) + next
def choose(l, k):
    return list(choose_iter(l, k))

这将返回我需要的内容,但是我可以对其进行修改,这样就不必使用yield函数了吗?我还没有研究过收益率,也不想为此感到困惑。

2 个答案:

答案 0 :(得分:0)

您可以使用itertools

import itertools
for combination in itertools.combinations([i for i in range(1, n+1)], k):
    print(combination)

对于n=7k=5,您拥有:

(1, 2, 3, 4, 5)
(1, 2, 3, 4, 6)
(1, 2, 3, 4, 7)
(1, 2, 3, 5, 6)
(1, 2, 3, 5, 7)
(1, 2, 3, 6, 7)
(1, 2, 4, 5, 6)
(1, 2, 4, 5, 7)
(1, 2, 4, 6, 7)
(1, 2, 5, 6, 7)
(1, 3, 4, 5, 6)
(1, 3, 4, 5, 7)
(1, 3, 4, 6, 7)
(1, 3, 5, 6, 7)
(1, 4, 5, 6, 7)
(2, 3, 4, 5, 6)
(2, 3, 4, 5, 7)
(2, 3, 4, 6, 7)
(2, 3, 5, 6, 7)
(2, 4, 5, 6, 7)
(3, 4, 5, 6, 7)

答案 1 :(得分:0)

我认为这应该是正确的代码

def choose_iter(elements, length):
    for i in range(len(elements)):
        if length == 1:
            yield (elements[i],)
        else:
            for j in choose_iter(elements[:len(elements)], length - 1):
                yield (elements[i],) + j
def choose(l, k):
    for i in choose_iter(l, k):
        print(i)

yield与return类似,但是在这种情况下,您需要yield语句,否则代码将无法工作。你可以检查一下 What does the "yield" keyword do? 有关更多信息。

还要避免使用“ next”作为变量,因为它也是python函数。

希望我能帮上忙。