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

Python 如何计算“for”循环中最后一项的平均值?,python,numpy,for-loop,Python,Numpy,For Loop,我有以下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项的平均值 不幸的是,代码在以下情况

我有以下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项的平均值

不幸的是,代码在以下情况下失败:

Traceback (most recent call last):
  File "avg_test.py", line 6, in <module>
    avg10 = np.average(data[:-10]['value'])
TypeError: list indices must be integers or slices, not str
因为我不确定如果字典列表中的10项都不可用,我如何才能访问10项或更少的最后值项,并将其传递到numpy的平均值函数中

例如,我期望输出类似于:

[{'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个值项的平均值最大


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

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


数据是一个目录列表。因此,data[:-10]也是一个dict列表,这意味着data[:-10]['value']没有意义。您希望数据[:-10]]中的x类似于[x['value'],而是在dict列表上进行迭代。

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


数据是一个目录列表。因此,data[:-10]也是一个dict列表,这意味着data[:-10]['value']没有意义。您希望在数据[:-10]]中的x使用类似[x['value']的东西,而是在dict列表上迭代。

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

您的线路:

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

avg10 = np.average([data[j]['value'] if j>=0 else value for j in range(i-10, i) ])
但这将导致你的平均值不是前10个结果的平均值,因为没有前10个结果可用。。。 注意:我选择第一个值表示平均值本身,而第二个值表示最后10个可用值的平均值,因此只有最后一个值。所以前两个值本身就是平均值。这很奇怪。您可以决定使用以下命令更改此行为:

avg10=np.平均值[数据[j][‘值’]如果j>=0,则为范围i-10中j的第一平均值,i]

如果您决定将值本身包含在最后10个项目的平均值内,即{value;最后9个项目的平均值和值本身}的dict,那么对于第一个没有以前项目的项目,您可以执行以下操作:

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

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

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

import random
import numpy as np
data = []
for i in range(0, 100):
    values = np.random.uniform(0, 100, size=100)
    value = random.randrange(100)
    avg10 = np.average(values[max(value-9,0):value+1])
    data += [{'value': value, 'avg10': avg10}]
您的线路:

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

avg10 = np.average([data[j]['value'] if j>=0 else value for j in range(i-10, i) ])
但这将导致你的平均值不是前10个结果的平均值,因为没有前10个结果可用。。。 注意:我选择第一个值表示平均值本身,而第二个值表示最后10个可用值的平均值,因此只有最后一个值。所以前两个值本身就是平均值。这很奇怪。您可以决定使用以下命令更改此行为:

avg10=np.平均值[数据[j][‘值’]如果j>=0,则为范围i-10中j的第一平均值,i]

如果您决定将值本身包含在最后10个项目的平均值内,即{value;最后9个项目的平均值和值本身}的dict,那么对于第一个没有以前项目的项目,您可以执行以下操作:

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}]
在最后一种情况下,您可以更精确地编辑问题

试试这个

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

data = []
for i in range(0, 100):
    value = random.randrange(100)
    avg10 = np.average(range(value+1)[-10:]) if value !=0 else 0
    data.append({'value': value, 'avg10': avg10})
print(data)
试试这个

import random
import numpy as np

data = []
for i in range(0, 100):
    value = random.randrange(100)
    avg10 = np.average(range(value+1)[-10:]) if value !=0 else 0
    data.append({'value': value, 'avg10': avg10})
print(data)

以下是完整的解决方案,其中平均值还考虑了当前值:

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}]
基本上接受包含要求平均值的数据的数组,所以需要使用将字典列表转换为平面列表。对于范围,-minlendata,10:用于根据数据的当前大小获取最后10项或更少项

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

>>> data = []
>>> for i in range(0, 10):
...     index = -min(len(data), 5)
...     data += [i]
...     print(i, index, data[index:])
... 
0 0 [0]
1 -1 [1]
2 -2 [1, 2]
3 -3 [1, 2, 3]
4 -4 [1, 2, 3, 4]
5 -5 [1, 2, 3, 4, 5]
6 -5 [2, 3, 4, 5, 6]
7 -5 [3, 4, 5, 6, 7]
8 -5 [4, 5, 6, 7, 8]
9 -5 [5, 6, 7, 8, 9]

以下是完整的解决方案,其中平均值还考虑了当前值:

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}]
基本上接受包含要求平均值的数据的数组,所以需要使用将字典列表转换为平面列表。对于范围,-minlendata,10:用于根据数据的当前大小获取最后10项或更少项

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

>>> data = []
>>> for i in range(0, 10):
...     index = -min(len(data), 5)
...     data += [i]
...     print(i, index, data[index:])
... 
0 0 [0]
1 -1 [1]
2 -2 [1, 2]
3 -3 [1, 2, 3]
4 -4 [1, 2, 3, 4]
5 -5 [1, 2, 3, 4, 5]
6 -5 [2, 3, 4, 5, 6]
7 -5 [3, 4, 5, 6, 7]
8 -5 [4, 5, 6, 7, 8]
9 -5 [5, 6, 7, 8, 9]

你的意思是avg10=np.averagevalue[:-10]?如果不是,当你说最后10个时,你的意思是总共1000个元素乘以10吗?@cᴏʟᴅsᴘᴇᴇᴅ 但value是存储在数据列表中的单个值,所以要访问最后10项,我需要从列表中访问它。@cᴏʟᴅsᴘᴇᴇᴅ 随着for循环的进行,当前数据状态的最后10项。您的意思是avg10=np.averagev吗

value[:-10]?如果不是,当你说最后10个时,你的意思是总共1000个元素乘以10吗?@cᴏʟᴅsᴘᴇᴇᴅ 但value是存储在数据列表中的单个值,所以要访问最后10项,我需要从列表中访问它。@cᴏʟᴅsᴘᴇᴇᴅ 随着for循环的进行,数据当前状态的最后10项。是的,这就是我的意思,但是前10项有一个问题,因为它生成RuntimeWarning:mean of empty slice。有什么办法可以避免吗?同时正确计算前10项的平均值?是的,这就是我的意思,但是前10项有一个问题,因为它生成RuntimeWarning:mean of empty slice。有什么办法可以避免吗?同时正确计算最后10项的平均值?嗯,差不多,但我认为第一项的平均值计算不正确,例如,[{'value':1,'avg10':49.686383642577212},{'value':0,'avg10':48.589859834652742}或[{'value':52,'avg10':52.935084257804498},不知道为什么。值和avg10之间的关系到底是什么?你在寻找最后10个项目的平均值和一个随机值,不是吗?avg10是最后10个项目的平均值,包括当前项目相对于当前项目的平均值。好吧,告诉我一些事情。想象一下随机值是56。你想要之前最后10个项目的平均值吗e 56,对吗?10个过去项目的平均值,理想情况下包括或不包括当前项目56,更简单的是。我认为最好包括当前项目,因为第一个项目的平均值将丢失。嗯,差不多,但我认为第一个项目的平均值计算不正确,例如。[{value':1,'avg10':49.686383642577212},{'value':0,'avg10':48.589859834652742}或[{'value':52,'avg10':52.93508425780498},不知道为什么。值和avg10之间的关系到底是什么?你在寻找最后10个项目的平均值和一个随机值,不是吗?avg10是最后10个项目的平均值,包括当前项目相对于当前项目的平均值。好吧,告诉我一些事情。想象一下随机值是56。你想要之前最后10个项目的平均值吗e 56,对吗?平均10个过去的项目,理想情况下包括或不包括当前项目56,任何更简单的。我认为最好包括当前项目,因为第一个项目的平均值将丢失。啊,你是对的,我编辑了,这是第一个项目。因为没有任何以前的项目,你必须决定在这种情况下该怎么做。这是一个例外。我决定将自己作为平均值。啊,你是对的,我编辑了,这是第一项。因为根本没有以前的项目,你必须决定在这种情况下做什么。这是一个例外。我决定将自己作为平均值。为什么要使用随机值进行范围计算?平均值不正确,例如:[{值]:44,'avg10':38.5},{'value':18,'avg10':12.5}…rangevalue+1[-10:]将给出最后10个值。例如,如果值为10,这将给出[10,9,8,7,6,5,4,3,2,1]类似的东西:[{'value':50,'avg10':45.5},{'value':10,'avg10':5.5}.value是添加到数据dict的单个随机值,因此对我来说,将其传递到range没有意义为什么使用随机值进行range?平均值不正确,例如:[{value':44,'avg10':38.5},{'value':18,'avg10':12.5}…rangevalue+1[-10:]将给出最后10个值。例如,如果该值为10,则会给出最后10个值[10,9,8,7,6,5,4,3,2,1]类似的东西:[{'value':50,'avg10':45.5},{'value':10,'avg10':5.5}。值是添加到数据dict中的单个随机值,所以对我来说,将其传递到范围中没有意义