For Python中的循环以查找列表的总和

时间:2019-02-06 11:19:42

标签: python loops

我对python中的列表有疑问。目前,我有一些看起来像这样的代码:

muaverage = (w[0] * mu[0] + w[1] * mu[1])

其中w和mu都是包含2个变量的列表。 虽然w和mu仅包含两个变量,但是代码可以正常工作,但是我想向这些列表添加更多的值,为此目的,遍历列表以查找总和似乎是最合适的。我尝试了以下

for i in range(0,len(mu)):
    muaverage = sum(w[i] * mu[i])

,但这一直显示错误。任何建议将不胜感激!

2 个答案:

答案 0 :(得分:5)

您的代码有两个问题:

  • 您将在每次迭代中覆盖muaverage的先前值
  • 您正在尝试获取单个数值的sum

相反,您可以 使用常规的for循环:

muaverage = 0                  # initialize before the loop
for i in range(0,len(mu)):
    muaverage += w[i] * mu[i]  # add to current value with +=

在生成器表达式中使用sum

muaverage = sum(w[i] * mu[i] for i in range(len(mu)))

或将sumzip设为suggested by @yatu

muaverage = sum(x * y for x, y in zip(w, mu))

但是请注意,muaverage并不是一个平均值。为此,您仍然需要将其除以元素数量或w中的权重之和(?)以获得加权平均值。

答案 1 :(得分:1)

您似乎在muw之间使用(内)点积。 要自己实现,只需参考@tobias_k答案。但是,在Python中用于数字数组的标准包(即NumPy)中,函数dot()或运算符@(在Python> = 3.5中)将满足您的要求,即(内部)点产品。

import numpy as np

# define some dummy objects
mu = list(range(0, 10))
w = list(range(10, 20))

muaverage = sum(x * y for x, y in zip(mu, w))
# muaverage == 735

muaverage = np.dot(mu, w)
# muaverage == 735

# operands of `@` should be `numpy.array()`
mu = np.array(mu)
w = np.array(w)
muaverage = mu @ w
# muaverage == 735

但是您的命名暗示您可能在加权平均之后,您可能会使用average()来接受weight参数,例如

import numpy as np

# define some dummy objects
mu = list(range(0, 10))
w = list(range(10, 20))

muaverage = np.average(mu, weights=w)
# muaverage == 5.068965517241379

muaverage = np.dot(mu, w) / np.sum(w)
# muaverage == 5.068965517241379

(已编辑,以便更好地包含np.dot())。