2

我有一个整数列表说l1=[a,b,c]_1to9=range(1,10)。我想得到这个:

 [a*i1+b*i2+c*i3 for i1 in _1to9 for i2 in _1to9 for i3 in _1to9]

但问题是l1不一定是 3 个元素的列表。那么我该如何概括?

编辑:帮助可视化我想要实现的目标:

 >>> l1=[10001,1010, 100]
 >>> [l1[0]+i1+l1[1]*i2+l1[2]*i3 for i1 in _1to9 for i2 in _1to9 for i3 in _1to9]
4

1 回答 1

11

一些基本的数学可能会有所帮助。首先,实现a*i1+b*i2+c*i3是两个三元素列表的内(点)积,可以推广为

def dot_product(a, b):
    return sum(x * y for x, y in zip(a, b))

for i1 in _1to9 for i2 in _1to9 for i3 in _1to9循环 的笛卡尔[_1to9] * 3。那在 Python 标准库中itertools.product,所以你有

[dot_product([a, b, c], x) for x in itertools.product(_1to9, repeat=3)]

将其推广到任意列表l给出

[dot_product(l, x) for x in itertools.product(_1to9, repeat=len(l))]
于 2012-05-20T13:33:30.943 回答