繁体   English   中英

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

[英]Expanding tuple into number repeated X times in a list (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倍? 如果它们是字符串,我可以这样做,但必须有一种数字方式来做到这一点。

你可以这样做:

>>> 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

如果要扩展列表,它就像下面这样简单:

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]

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

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

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)

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM