Python - dict中键的每个值的平均值

时间:2017-09-23 17:43:01

标签: python loops dictionary

我无法在整个字典中进行迭代,无法对键的每个元素元素执行简单的汇总统计(平均值)。

我的字典由数字列表中的键和值组成:

test_dict={'NJ':[20,50,70,90,100],'NY':[10,3,0,99,57],'CT':[90,1000,2,3.4,5]}

我知道我可以访问每个键的第一个值,例如,通过执行下面的操作,但是我在下一步添加另一个for循环以迭代值中的所有元素时遇到了麻烦。

location1=[element[0] for element in test_dict.values()] 
location1_avg=sum(location1)/len(location1)

我的最终目标是使用标签作为键(位置1 ... i)以及该位置的各州的平均值。所以第一个键值是Location1:40,依此类推。

我有以下尝试,但错误消息是'列表索引超出范围',我不知道在这种情况下如何正确迭代。

for element in test_dict.values():
    avg=list()
    for nums in element[i]:
        avg[i]=sum(element[i][nums])/len(element[i][nums])

为每个请求添加所需的输出

soln_dict={'Location1':40,'Location2':351,'Loction3':24,'Loction4':43.24,'Loction5':54}

感谢您的帮助!

4 个答案:

答案 0 :(得分:1)

不确定您的错误在哪里,但i对于“使用无效/有害的索引”是一个死的赠品。

您的问题有一个直接的输入/输出数据流,并且非常适合使用字典理解,迭代键,值并使用均值作为值重建字典:

test_dict={'NJ':[20,50,70,90,100],'NY':[10,3,0,99,57],'CT':[90,1000,2,3.4,5]}

result = {k:sum(x)/len(x) for k,x in test_dict.items()}

print(result)

给出:

{'CT': 220.08, 'NJ': 66.0, 'NY': 33.8}

编辑:您似乎想要一个带有匿名密钥的“转置”版本,在这种情况下,只需使用值的压缩版本:

result = {"location{}".format(i):sum(v)/len(v) for i,v in enumerate(zip(*test_dict.values()),1)}

给出:

{'location3': 24.0, 'location5': 54.0, 'location1': 40.0, 'location2': 351.0, 'location4': 64.13333333333334}

答案 1 :(得分:1)

你可以这样做:

test_dict={'NJ':[20,50,70,90,100],'NY':[10,3,0,99,57],'CT':[90,1000,2,3.4,5]}
avg=[sum(element) / len(element) for element in test_dict.values()]
print(avg) # => [66.0, 33.8, 220.08]

对于字典:

test_dict={'NJ':[20,50,70,90,100],'NY':[10,3,0,99,57],'CT':[90,1000,2,3.4,5]}
avg={ k:sum(test_dict[k]) / len(test_dict[k]) for k in test_dict}
print(avg) # => {'NJ': 66.0, 'NY': 33.8, 'CT': 220.08}

回答编辑过的问题:

如果数组的长度始终为5,请使用:

test_dict={'NJ':[20,50,70,90,100],'NY':[10,3,0,99,57],'CT':[90,1000,2,3.4,5]}
avg={}
for i in range(5):
  avg['Location'+str(i+1)] = sum(test_dict[k][i] for k in test_dict)/len(test_dict)
print(avg)

输出:

{'Location1': 40.0, 'Location2': 351.0, 'Location3': 24.0, 'Location4': 64.13333333333334, 'Location5': 54.0}

答案 2 :(得分:1)

只是做:

#loop through the dictionary
for key,value in test_dict.items(): 

   #use reduce to calculate the avg
   print(key, reduce(lambda x, y: x + y, test_dict[key]) / len(test_dict[key]))

这将打印:

NJ 66.0
NY 33.8
CT 220.08

编辑:根据OP要求的变化:

l = list(iter(test_dict.values()))                      #convert values to list
print(l)
#[[20, 50, 70, 90, 100], [10, 3, 0, 99, 57], [90, 1000, 2, 3.4, 5]]
d={}                                                                  #final ditionary
for i in range(len(l[0])): 
   row_list = [row[i] for row in l]                     #get values column-wise
   d['location'+str(i+1)] = sum(row_list)/len(row_list)               #calculate avg

print(d)
#{'location1': 40.0, 'location2': 351.0, 'location3': 24.0, 'location4': 64.13333333333334, 'location5': 54.0}

注意:你对loaction4提出质疑的平均值是错误的。

答案 3 :(得分:1)

为了让它尽可能简单,我建议:

b.iloc[-1, :]

给出了:

from statistics import mean

test_dict={'NJ':[20,50,70,90,100],'NY':[10,3,0,99,57],'CT':[90,1000,2,3.4,5]}

# put the data in a list of lists
# (throw away the city names)
l = [seq for seq in test_dict.values()]


# put together 1st values, 2nd values, etc.
r = [mean(i) for i in zip(*l)]
print(r)

我分裂为征服:我将这个字典变成了一个列表列表,然后使用zip来放置"列"一起。由于zip期望参数用逗号而不是列表分隔,因此我使用星号运算符([40, 351, 24, 64.13333333333334, 54] )进行转换。

我不确定是否应该从中获取地点列表?它只是* +索引否? (如果是,为什么不把它留在列表中?)

对于均值函数,请参阅statistics包(对于Python> 3.4)。否则你可以写自己的:

Location_

我从Finding the average of a list获取灵感。 可能有点神秘,编写一个没有mean = lambda l: reduce(lambda x, y: x+y, l) / len(l) 的函数可能更清楚,但是单行使复制和粘贴更容易。

如果您使用的是Python 3,请从reduce导入reduce