用于python中的循环以查找列表的和
我有一个关于python中列表的问题。目前我有一些代码如下所示:用于python中的循环以查找列表的和,python,loops,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]) 但这显示了一个错误。任何建议都将不胜感激 您的代码有
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])
但这显示了一个错误。任何建议都将不胜感激 您的代码有两个问题:
- 在每次迭代中,您将覆盖先前的
muaverage
- 您正在尝试获取单个数值的
和
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)))
或sum
和zip
,如下所示:
然而,请注意,muaverage
并非真正的平均值;为此,您仍然需要将其除以元素数,或加权平均值的权重(?)之和。您似乎在寻找mu
和w
之间的(内部)点积。
要自己实现这一点,只需参考@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()
)。求和(i*j表示i,j在zip(w,m)中))
?您能告诉我您遇到了什么错误吗?错误显示对象“float”不可编辑!循环的问题是在每次迭代中都覆盖了以前的值。此外,您正在尝试获取单个整数的和。另外,这不是平均值。numpy.dot()
也可以。也许,我们需要的是一个加权平均值,你可以用它除以权重之和。类似地,numpy.average()
接受了一个weight
参数,正是因为这个参数。@norok2很好,这很有意义,特别是当第二个数组被称为w
时。你为什么不把它作为另一个答案呢?另一个只是为了好玩的想法sum(星图(lambda x,y:x*y,zip(w,mu))
@yatu你肯定是指sum(itertools.starmap(operator.mul,zip(w,mu))
?这是另一个问题@j_abrams。我建议你为这个问题提出一个正确的新问题,你肯定会得到一些帮助
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