列表中元素的总和,当一个元素可以取两个不同的值时

sum of elements in list, when an element can take two different values

我有一个元素列表,想得到这个列表的总和: a = [4, 5, "X", "X"]。 但是 X 可以是 2 个不同的值,2 或 3。所以这个列表有 4 个总和:

sum1 = sum([4, 5, 2, 2]) = 13
sum2 = sum([4, 5, 2, 3]) = 14
sum3 = sum([4, 5, 3, 2]) = 14
sum4 = sum([4, 5, 3, 3]) = 15

基本上我想获得列表所有可能总和的元组(或列表),例如:

sums = (13, 14, 14, 15)

对于包含 0 X 的输入列表,我想要一个包含 1 个元素的元组,对于一个包含 1 个 X 的元组,一个包含 2 个元素的元组,包含 2 个 X具有 4 个元素的元组...具有 n X 个 2^n 个元素的元组。

您可以使用 itertools.product 和列表理解

from itertools import product

a = [4, 5, "X", "X"]
r = a.count('X')
[sum(a[:len(a)-r] + [*i]) for i in product([2,3], repeat=r)]

输出

[13, 14, 14, 15]

测试更多案例

#test cases
for n in range(5):
    a=[4,5, *['X']*n]  # [4,5] .... [4,5,'X','X','X','X']
    r = a.count('X')
    print([sum(a[:len(a)-r] + [*i]) for i in product([2,3], repeat=r)])

输出

[9]
[11, 12]
[13, 14, 14, 15]
[15, 16, 16, 17, 16, 17, 17, 18]
[17, 18, 18, 19, 18, 19, 19, 20, 18, 19, 19, 20, 19, 20, 20, 21]

类似于 ,也使用 itertools.product,但使用字典将元素映射到可能的值。这可能更灵活,允许所有位置的占位符和不同占位符的不同值,并且还使代码更简单恕我直言。

>>> from itertools import product
>>> a = [4, 5, "X", "X"]
>>> vals = {"X": [2, 3]}
>>> [sum(p) for p in product(*[vals.get(x, [x]) for x in a])]
[13, 14, 14, 15]