列表中元素的总和,当一个元素可以取两个不同的值时
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]
我有一个元素列表,想得到这个列表的总和:
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]