我有以下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个元素的平均值)。在
在这种情况下,正确的语法是什么?在
这里是一个完整的解决方案,其中平均值也考虑到当前值:
基本上,^{} 接受包含要平均的数据的数组,因此字典列表需要使用list comprehensions转换为平面列表。对于范围,
-min(len(data), 10):
用于获取最后10个或更少的项目,具体取决于data
的当前大小。在为了更容易理解上面的示例,下面是更简单的帮助程序代码:
^{pr2}$错误消息给出了一个很好的提示:“列表索引必须是整数或切片,而不是str”。换句话说,我们必须寻找使用字符串作为列表索引的地方。在
data
是一个dict列表。因此,data[:-10]
也是一个dict列表,意思是{[x['value'] for x in data[:-10]]
的内容,遍历dict列表。在为了保留dict解决方案并避免第一个切片出现问题,可以执行以下操作。在
你的台词:
应该是:
^{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个项目的平均值和值本身}),那么第一个项目(没有前一个项目)没有更多的例外,您可以:
在最后一种情况下,您可以更精确地编辑您的问题;)
相关问题 更多 >
编程相关推荐