我有一个问题,例如我有清单
a = [1,2,3,4,5,6,7,8,9,10]
b = [10,9,8,7,6,5,4,3,2,1]
c = [3,4,5,6,10,4,6,7,4,3]
d = [5,4,5,6,8,4,3,2,4,50]
我想计算这四个列表的产品。
其实可能看起来很简单,我们只是写
e = []
for i in range(0, len(a)):
e.append(a[i] * b[i] * c[i] * d[i])
但问题是,如果我有一致数量的列表怎么办?有时我有1个列表,8个列表,4个列表,或者可能有25个列表。我想编写一个代码,自动计算同一索引中一致数量的列表的乘积。
答案 0 :(得分:1)
您可以将列表放在更大的列表中(列表列表):
super_list = [a, b, c, d] # add any more lists you want
然后:
result = []
for i in xrange(0, len(a)):
p = 1
for sub_list in super_list:
p *= sub_list[i]
result.append(p)
答案 1 :(得分:1)
您可以zip
这些列表并使用reduce
来增加元素:
a = [1,2,3,4,5,6,7,8,9,10]
b = [10,9,8,7,6,5,4,3,2,1]
c = [3,4,5,6,10,4,6,7,4,3]
d = [5,4,5,6,8,4,3,2,4,50]
print([reduce(lambda x,y:x*y,i) for i in zip(a,b,c,d)])
结果:
[150, 288, 600, 1008, 2400, 480, 504, 336, 288, 1500]
如果您使用的是Python3.x,则需要from functools import reduce
来导入reduce
方法。
答案 2 :(得分:0)
试试这个
map(lambda x: reduce(lambda y, z: y * z, x), zip(a, b, c, d))
答案 3 :(得分:0)
您可以编写一个可以使用任意数量的参数重载的函数,并使用它来进行乘法运算。类似的东西:
def list_product(*args):
if len(args) == 0: #need at least one argument!
return []
arg_length = len(args[0])
for arg in args: #make sure all arrays have the same length
if arg_length != len(arg):
return []
out = []
for i in range(0, arg_length):
temp = 1
for arr in args:
temp *= arr[i]
out.append(temp)
return out
print(list_product([1,2,3],[4,5,6]))
# [4, 10, 18]
这具有可重复使用的优点。看起来你可能想在各种各样的阵列中使用它。一旦你有了这个功能,就可以很容易地将它与其他阵列一起使用。
a = [1,2,3,4]
b = [4,5,6,7]
c = [1,2,2,1]
list_product(a,b,c) # gives [4,20,36,28]
答案 4 :(得分:0)
使用*args
参数机制将所有列表收集到所有列表的一个元组中:
def product_of_lists(*args):
result = []
现在你有办法调用一个函数来做你想做的事。
接下来,使用zip
依次迭代每个列表中的每个值。也就是说,zip(a,b,c)
将产生(a [0],b [0],c [0])的元组,然后是(a 1,b 1,c的另一个元组1)等。
for t in zip(*args):
在此上下文中使用*args
将args的元组展平为一堆单独的参数,就好像您已编写zip(args[0], args[1], ...)
一样。
此时,t
是一个需要乘法的元组。
您可以使用functools.reduce
来应用在迭代中累积值的函数(元组是迭代!)。像这样:
functools.reduce(lambda a,b: calc(a,b), t)
这会将lambda应用于每对值:(t [0],t 1),然后(previous-of-previous,t [n])等。
因此,在您的情况下,您可以编写自己的lambda函数来进行乘法运算:
r = functools.reduce(lambda a,b: a*b, t)
或者,您可以导入运算符并使用operator.mul函数,它正是这样做的:
r = functools.reduce(operator.mul, t)
然后捕获结果:
result.append(r)
return result
全部放在一起:
import functools
def product_of_lists(*args):
result = []
for t in zip(*args):
r = functools.reduce(lambda a,b: a*b, t)
result.append(r)
return result
答案 5 :(得分:0)
使用Python 3,定义产品功能(在许多情况下很有用):
def rp(seq):
return 1 if len(seq)==0 else seq[0]*rp(seq[1:])
然后直接计算结果
result = [rp(x) for x in zip(a,b,c,d)]
或使用列表清单:
super_list = [a,b,c,d]
result = [rp(x) for x in zip(*super_list)]