0

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

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 的平均值)。

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

4

2 回答 2

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

现在字典中的每个元素都有一个计数和一个平均值。您必须使用 dct1[key][1],而不是使用 dct1[key]。

于 2013-04-17T10:27:33.213 回答
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 理解将其替换为将键映射到平均值的字典。

于 2013-04-17T10:16:51.680 回答