我正在尝试生成数字1-5的所有可能递增组合的列表。例如,对于N = 3,有[123],[125],[134]等。有32种组合,我可以手工生成它们,但这似乎是学习何时使用算法的一种合理方法。对于较大的数字,我必须再次执行。但是,我对于从哪里开始感到迷茫。
答案 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)
实际上为您提供了从m
到n
之间的所有值。
这是一种算法,如果您不知道序列将持续多长时间:允许第一个数字的范围从最低值到最高值。然后,允许每个其他数字的范围从前一个数字的正上方到最大允许值。重复此操作,直到有足够的数字。您可以使用以下代码实现该目标:
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']]