Python-获取n个1d数组中元素的所有可能总和

时间:2018-10-29 15:13:23

标签: python

给定一个整数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未知,所以我不知道需要进行多少次循环。

预先感谢

5 个答案:

答案 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)

这将为您工作,并为您提供一组输出以确保唯一的总和值。 na可以是任何整数或列表。

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)

使用maplambda

n = 3
a = [1, 2, 3, 4, 5, 6]
print(list(set(map(lambda k:sum(k), combinations_with_replacement(a, n)))))