给定一个整数n和一个数组a,我想返回一个数组,其中a本身的所有可能值都是n次。
Example: n = 3, a = [1, 2, 3, 4, 5, 6]
Output: [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
第一个元素是1 + 1 + 1,第二个元素是1 + 1 + 2,等等。
有什么优雅的方法吗?我已经尝试过循环,但是由于n未知,所以我不知道需要进行多少次循环。
预先感谢
答案 0 :(得分:6)
生成所有可能的3元素组合,然后对其求和:
from itertools import combinations_with_replacement
n = 3
li = [1, 2, 3, 4, 5, 6]
print([sum(comb) for comb in combinations_with_replacement(li, n)])
# [3, 4, 5, 6, 7, 8, 5, 6, 7, 8, 9, 7, 8, 9, 10, 9, 10, 11, 11, 12, 13, 6, 7, 8, 9, 10, 8, 9, 10, 11, 10, 11, 12, 12, 13, 14, 9, 10, 11, 12, 11, 12, 13, 13, 14, 15, 12, 13, 14, 14, 15, 16, 15, 16, 17, 18]
由于您似乎对唯一和感兴趣,因此请使用一组:
print(set(sum(comb) for comb in combinations_with_replacement(li, n)))
# {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}
请注意,不能保证将这些产品定购。如果您希望有序的输出是明确的:
print(sorted(set(sum(comb) for comb in combinations_with_replacement(li, n))))
答案 1 :(得分:3)
另一种解决方案是使用itertools.product
。在这里,您首先从a
生成3对元素的对,然后对其求和。要消除重复项,请使用集合{ }
,然后使用列表推导完成求和。在这里,我使用*[a]*n
使n
的任何值都更通用。
import itertools
n = 3
totals = {sum(item) for item in itertools.product(*[a]*n)}
# {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}
另一种可读的方法是使用变量lists
,然后将其传递给itertools.product
lists = [a]*n
totals = {sum(item) for item in itertools.product(*lists)}
要获取所有可能的金额,包括重复项,只需使用[ ]
而不是{ }
。
答案 2 :(得分:3)
这将为您工作,并为您提供一组输出以确保唯一的总和值。 n
和a
可以是任何整数或列表。
import itertools
n = 3
a = [1, 2, 3, 4, 5, 6]
b = [a for _ in range(n)]
sums = set(sum(_b) for _b in itertools.product(*b))
答案 3 :(得分:0)
纯Python实现:
def comb_sum(arr, n):
if n == 1:
[(yield a) for a in arr]
else:
for i, a in enumerate(arr):
[(yield a + b) for b in comb_sum(arr[i:], n-1)]
my_list = [1, 2, 3, 4, 5, 6]
n = 3
sums = set([c for c in comb_sum(my_list, n)])
答案 4 :(得分:0)
使用map
和lambda
,
n = 3
a = [1, 2, 3, 4, 5, 6]
print(list(set(map(lambda k:sum(k), combinations_with_replacement(a, n)))))