1-5的组合增加

时间:2018-10-31 18:56:41

标签: python

我正在尝试生成数字1-5的所有可能递增组合的列表。例如,对于N = 3,有[123],[125],[134]等。有32种组合,我可以手工生成它们,但这似乎是学习何时使用算法的一种合理方法。对于较大的数字,我必须再次执行。但是,我对于从哪里开始感到迷茫。

3 个答案:

答案 0 :(得分:1)

很简单:

>>>from itertools import combinations_with_replacement
>>> list(combinations_with_replacement(range(1,6),3)
... )
[(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4), (1, 1, 5), (1, 2, 2), (1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 3), (1, 3, 4), (1, 3, 5), (1, 4, 4), (1, 4, 5), (1, 5, 5), (2, 2, 2), (2, 2, 3), (2, 2, 4), (2, 2, 5), (2, 3, 3), (2, 3, 4), (2, 3, 5), (2, 4, 4), (2, 4, 5), (2, 5, 5), (3, 3, 3), (3, 3, 4), (3, 3, 5), (3, 4, 4), (3, 4, 5), (3, 5, 5), (4, 4, 4), (4, 4, 5), (4, 5, 5), (5, 5, 5)]

计数为35,而不是32。我转换为list只是为了打印结果-您可以将其保留为函数调用结果的迭代。如果您不想重复元素,请使用combinations

答案 1 :(得分:0)

如果您总是有3个项目的序列,则有一个简单的“单线”:

[
    [a, b, c] 
    for a in range(1, 6) for b in range(1, 6) for c in range(1, 6) 
    if a < b < c
]

请注意,在Python中,range(m, n + 1)实际上为您提供了从mn之间的所有值。

这是一种算法,如果您不知道序列将持续多长时间:允许第一个数字的范围从最低值到最高值。然后,允许每个其他数字的范围从前一个数字的正上方到最大允许值。重复此操作,直到有足够的数字。您可以使用以下代码实现该目标:

max_val = 5
n_digits = 3

for n in range(1, n_digits + 1):   # 1 to 3
    if n == 1:
        # create initial entries
        results = [[x] for x in range(1, max_val + 1)]
    else:
        old_results = results
        results = []
        for old_entry in old_results:
            last_digit = old_entry[-1]
            # create new entries with one more digit
            for x in range(last_digit + 1, max_val + 1):
                entry = old_entry + [x]
                results.append(entry)

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

还请注意,使用itertools的解决方案不会严格按照您的要求生成组合。除非我遗漏了一些东西,否则您的测试用例似乎有10个有效答案,而不是32个。

答案 2 :(得分:0)

您可以在一行中尝试使用 itertools产品中的该产品:

from itertools import product

list(map(lambda k: [''.join(k)], list(map(lambda j: [str(i) for i in j],list(product(list(map(int,input().split())), repeat=3))))))

输入:

1 2 3

输出:

[['111'], ['112'], ['113'], ['121'], ['122'], ['123'], ['131'], ['132'], ['133'], ['211'], ['212'], ['213'], ['221'], ['222'], ['223'], ['231'], ['232'], ['233'], ['311'], ['312'], ['313'], ['321'], ['322'], ['323'], ['331'], ['332'], ['333']]