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

ここでは、いくつかの基本的な数学が役立つ場合があります。まず、が 2 つの 3 要素リスト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ループします。これは Python 標準ライブラリに としてあるので、[_1to9] * 3itertools.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 に答える