我正在使用文本文件中的数据行制作字典。前三列数据成为键,第四列中的数据形成字典的值。代码如下:
def formatter(lines):
for line in lines:
if not line.strip(): continue
yield [to_float(item) for item in line.split()]
dct1 = {}
with open('test.txt') as f1:
for row in formatter(f1):
dct1[tuple(row[:3])] = row[3]
此代码有效。问题在于文件中的密钥重复被从中拉出数据。该文件可能有两行:
1 2 3 50
1 2 3 100
最终字典dct1只包含第二行:dct1 [(1,2,3)] = [100]。我想要做的,目前还不能,每次程序试图覆盖一个键,而是平均给定键的值,即如果上面两行被读入,则值为密钥(1,2,3)将为75(平均值为50和100)。
非常感谢任何帮助。 非常感谢
答案 0 :(得分:2)
要计算多个键的平均值,您需要先收集所有值 ,然后计算之后的平均值。
使用collections.defaultdict
轻松收集值:
from collections import defaultdict
dct1 = defaultdict(list)
with open('test.txt') as f1:
for row in formatter(f1):
dct1[tuple(row[:3])].append(row[3])
dct1 = {k: sum(v)/len(v) for k, v in dct1.iteritems()}
首先dct1
是将键映射到列出值的字典。然后dict理解用字典映射键替换为平均值。
答案 1 :(得分:2)
一旦你对前两个进行了平均,找到第三个就会搞砸你,因为你不知道dict中的值是单个值还是前两个的平均值。你还需要在dict中保留计数:
for row in formatter(f1):
key = tuple(row[:3])
if key not in dct1:
dct1[key] = (1, row[3])
else:
val = dct1[key]
dct1[key] = (val[0] + 1, (val[0] * val[1] + row[:3]) / (val[0] + 1))
现在dict中的每个元素都有一个计数和一个平均值。而不是使用dct1 [key],你将不得不使用dct1 [key] [1]。