如何计算“for”循环中最后一项的平均值?

2024-09-28 22:27:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下Python 3代码:

import random
import numpy as np
data = []
for i in range(0, 100):
    value = random.randrange(100)
    avg10 = np.average(data[:-10]['value'])
    data += [{'value': value, 'avg10': avg10}]

它的目标是在列表中生成100个随机数字以及最后10个项目的平均值。在

不幸的是,代码失败:

^{pr2}$

因为我不确定如何从字典列表中访问10个last value项目(如果10个项目都不可用,则为更少的项目)并将其传递给numpy的average函数。在

例如,我期望输出如下:

[{'value': 11, 'avg10': 11}, {'value': 62, 'avg10': 36.5}, {'value': 56, 'avg10': 43}, {'value': 48, 'avg10': 44.25}, {'value': 43, 'avg10': 41.8}]

等等。在

其中avg10是最后(至少)10个项目相对于当前项目的平均值(理想情况下包括当前项目,但不必如此)。如果前一个元素只有一个,那么它是1个元素的平均值,如果是两个元素,则是两个值项的平均值,依此类推(最后10个元素的平均值)。在

在这种情况下,正确的语法是什么?在


Tags: 项目代码importnumpy元素列表datavalue
3条回答

这里是一个完整的解决方案,其中平均值也考虑到当前值:

import random
import numpy as np
data = []
for i in range(0, 200):
    value = random.randrange(100)
    avg10 = np.average([x['value'] for x in data[-min(len(data), 10):]] + [value])
    data += [{'value': value, 'avg10': avg10}]

基本上,^{}接受包含要平均的数据的数组,因此字典列表需要使用list comprehensions转换为平面列表。对于范围,-min(len(data), 10):用于获取最后10个或更少的项目,具体取决于data的当前大小。在


为了更容易理解上面的示例,下面是更简单的帮助程序代码:

^{pr2}$

错误消息给出了一个很好的提示:“列表索引必须是整数或切片,而不是str”。换句话说,我们必须寻找使用字符串作为列表索引的地方。在

data是一个dict列表。因此,data[:-10]也是一个dict列表,意思是{}没有意义。您需要类似[x['value'] for x in data[:-10]]的内容,遍历dict列表。在

为了保留dict解决方案并避免第一个切片出现问题,可以执行以下操作。在

你的台词:

avg10 = np.average(data[:-10]['value']) 

应该是:

^{pr2}$

但这将导致您的mean不是之前10个结果的平均值,因为没有10个以前的结果可用…
注意:我选择第一个值代表平均值本身,而第二个值代表最后10个可用值,因此只有最后一个值。所以前两个值都是平均值。这很奇怪。你可以决定用

avg10 = np.average([data[j]['value'] if j>=0 else firstAverage for j in range(i-10, i) ])

如果您决定将值本身包含在平均值的最后10个值中(即{value的dict;最后9个项目的平均值和值本身}),那么第一个项目(没有前一个项目)没有更多的例外,您可以:

for i in range(0, 100):
    value = random.randrange(100)
    lasts = [data[j]['value'] for j in range(i-9, i) if j>=0]
    lasts.append(value)
    avg10 = np.average(lasts)
    data += [{'value': value, 'avg10': avg10}]

在最后一种情况下,您可以更精确地编辑您的问题;)

相关问题 更多 >