我有一个这样的列表,
l=[1,2,3,4,5]
我想预测一个具有一些范围的相同大小的列表
l1=[x(between 1 and 3), x(4,6), x(7,9), x(10,12), x(13,15)]
使得两个列表相乘的和为155。例如,l1应该是
l1=[3, 6, 7, 11, 15],
so, [3, 6, 7, 11, 15] * [1, 2, 3, 4, 5] = 3 + 12 + 21 + 44 + 75 = 155
目前我正在做一个模拟(使用循环),并为每个项目生成这些范围的随机数,并重复该过程,直到总和为155。
我正在寻找更好的方法来更有效地做这件事。
您可以使用一种比使用简单的递归生成器猜测和检查更友好的方式强制执行此操作。基本上从第一个范围开始,然后递归地检查其余的范围,同时适当地更改总数。这个例子可能更容易理解:
def find_match(l, ranges, total, res=None):
if res is None:
res = []
if not ranges:
if total == 0:
yield res
return
head, *rest = ranges
for n in head:
yield from find_match(l[1:], rest, total - l[0] * n, res + [n])
l = [1,2,3,4,5]
l1 = [range(1, 4), range(4,7), range(7,10), range(10,13), range(13,16)]
for found in find_match(l, l1, 155):
print(found, sum(a * b for a, b in zip(found, l)))
打印解和乘积的和:
[1, 4, 9, 11, 15] 155
[1, 5, 7, 12, 15] 155
[1, 6, 8, 12, 14] 155
[1, 6, 9, 10, 15] 155
[2, 4, 9, 12, 14] 155
[2, 5, 8, 11, 15] 155
[2, 6, 9, 11, 14] 155
[3, 4, 7, 12, 15] 155
[3, 5, 8, 12, 14] 155
[3, 5, 9, 10, 15] 155
[3, 6, 7, 11, 15] 155
[3, 6, 9, 12, 13] 155