Python - 如何计算一致数量的列表中的a的乘积?

时间:2017-04-13 01:47:51

标签: python list

我有一个问题,例如我有清单

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个列表。我想编写一个代码,自动计算同一索引中一致数量的列表的乘积。

6 个答案:

答案 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)]