假设我有一个素数列表[2,3,5],我想获得所有N ^ 3这类产品的列表(或迭代器):
pow( 2, 0 ) * pow( 3, 0 ) * pow( 5, 0 )
pow( 2, 1 ) * pow( 3, 0 ) * pow( 5, 0 )
pow( 2, 0 ) * pow( 3, 1 ) * pow( 5, 0 )
pow( 2, 0 ) * pow( 3, 0 ) * pow( 5, 1 )
pow( 2, 1 ) * pow( 3, 1 ) * pow( 5, 0 )
pow( 2, 0 ) * pow( 3, 1 ) * pow( 5, 1 )
pow( 2, 1 ) * pow( 3, 0 ) * pow( 5, 1 )
[...]
pow( 2, N-1 ) * pow( 3, N-1 ) * pow( 5, N-1 )
这样做的pythonic方法是什么? (在长度为L的列表的情况下)
答案 0 :(得分:1)
我希望我帮到你。检查一下(N = 3):
from itertools import product
from operators import mul
primes = [2,3,5]
n = 3
sets = product(*[[(i,j) for j in range(n)] for i in primes])
# Now 'sets' contains all the combinations you want. If you just wanted pow(i,j), write i**j instead and skip the map in the next enumeration
# list(sets)
#[((2, 0), (3, 0), (5, 0)),
# ((2, 0), (3, 0), (5, 1)),
# ((2, 0), (3, 0), (5, 2)),
# ... ... ...
# ((2, 2), (3, 2), (5, 0)),
# ((2, 2), (3, 2), (5, 1)),
# ((2, 2), (3, 2), (5, 2))]
productlist = []
for t in sets:
productlist.append(reduce(mul,map(lambda tp:tp[0]**tp[1],t)))
# now productlist contains the multiplication of each n(=3) items:
#[1, 5, 25, 3, 15, 75, 9, 45, 225, 2, 10, 50, 6, 30, 150, 18, 90, 450, 4, 20, 100, 12, 60, 300, 36, 180, 900]
# pow( 2, 0 ) * pow( 3, 0 ) * pow( 5, 0 ) = 1
# pow( 2, 0 ) * pow( 3, 0 ) * pow( 5, 1 ) = 5
# pow( 2, 0 ) * pow( 3, 0 ) * pow( 5, 2 ) = 25
# .... ...
或者,一个衬垫可以是:
productlist = [reduce(mul,t) for t in product(*[[i**j for j in range(n)] for i in primes])]
答案 1 :(得分:1)
这应该这样做:
from itertools import product
from operator import mul
def all_products(l, k):
for t in product(*[[(p, e) for e in range(k)] for p in l]):
yield reduce(mul, [x[0] ** x[1] for x in t], 1)
关键是使用itertools.product
。
用法:
for prod in all_products([2, 3, 5], 3):
print prod
这将为您提供表格2^a0 * 3^a1 * 5^a2
0 <= aj < 3
。