Python 如何计算“for”循环中最后一项的平均值?
我有以下Python 3代码: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项的平均值 不幸的是,代码在以下情况
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中的单个随机值,所以对我来说,将其传递到范围中没有意义