将元组扩展为在列表中重复X次的数字(python)

时间:2011-10-11 21:58:40

标签: python

这看起来很简单,但我无法弄清楚。我有十个类别和分数分配给他们每个人。在中间步骤中,我将结果存储为[“得分”,重复]对,如:

[20,3]
[40,7]
[50,2]

...

我最终要做的是将这些对扩展为重复的数字,然后合并并平均得到一个这样的分数:

[20,20,20]
[40,40,40,40,40,40,40]
[50,50]

合并:

[20,20,20,40,40,40,40,40,40,40,50,50]

sum([20,20,20,40,40,40,40,40,40,40,50,50],0.0)/12

最终结果(平均):37

那么我如何完成第2步,我将每对的分数扩展X倍?如果它们是字符串,我可以这样做,但必须有一种数字方式来实现它。

3 个答案:

答案 0 :(得分:8)

你可以这样做:

>>> a = [20,3]
>>> [a[0]] * a[1]
[20, 20, 20]

然而,这一步并非真的有必要。要获得加权平均值,您可以将这些值乘以权重,求和,然后除以权重之和,例如:

float(20*3 + 40*7 + 50*2) / (3 + 7 + 2)

转换为float是为了避免Python 2中的整数除法。

可以这样写:

>>> xs = [[20,3], [40,7], [50,2]]
>>> float(sum(x[0] * x[1] for x in xs)) / sum(x[1] for x in xs)
36.666666666666664

答案 1 :(得分:3)

如果您想扩展列表,它就像:

一样简单
x = [20, 3] # for example
# a list consisting of x[1] copies, of a list that contains only x[0]:
expanded = [x[0]] * x[1]

但是,对于您所描述的问题,您实际上并不想要或不需要。你真正在做的是计算weighted average,其中第二个值是你的权重。

为此,我们可以将这些对相乘,添加这些结果,然后除以权重之和:

values = [[20, 3], [40, 7], [50, 2]]
total = sum(x[0] * x[1] for x in values)
weight = sum(x[1] for x in values)
average = float(total) / weight
# Or, more directly:
average = float(sum(x[0] * x[1] for x in values)) / sum(x[1] for x in values)

答案 2 :(得分:1)

如果您只想获得平均值,是否需要创建扩展列表?

我建议你做一个加权平均值。

count = sum(k[1] for k in scores)  # this is the count of items
total = sum(k[0] * k[1] for k in scores)   # this is the sum of scores
out = total / count