在字典中平均重复

时间:2013-04-17 10:12:36

标签: python dictionary python-2.7

我正在使用文本文件中的数据行制作字典。前三列数据成为键,第四列中的数据形成字典的值。代码如下:

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)。

非常感谢任何帮助。 非常感谢

2 个答案:

答案 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]。