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

2 投票
3 回答
2631 浏览
提问于 2025-04-17 04:07

这看起来很简单,但我就是搞不明白。我有十个类别,每个类别都有一个分数。在一个中间步骤中,我把结果存储成["分数", 重复次数]的形式,比如:

[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

那么,我该如何完成第二步,也就是把每对的分数扩展X次呢?如果它们是字符串我可以做到,但我需要用数字的方法来实现。

3 个回答

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

不过,对于你描述的问题,你其实并不想或者需要这样做。你真正要做的是计算一个 加权平均数,这里面的第二个值就是你的权重。

要做到这一点,我们只需要把每一对数相乘,然后把这些结果加起来,最后再除以权重的总和:

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

你可以这样做:

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

不过,这一步其实不是必须的。要计算加权平均数,你可以把每个数值乘以它的权重,然后把这些结果加起来,最后再除以所有权重的总和,比如:

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

这里把数字转换成浮点数是为了避免在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

撰写回答