Python中处理浮点计数器值的方法有哪些?

5
我正在编写一个计算平均值的程序。细节:我有一个文件夹,其中包含许多带有浮点数的 .txt 文件。 我所做的就是将浮点值相加,并将它们存储在每个文件的计数器中。之后,我想将计数器中的所有值相加,然后除以文件的总数(即 .txt 文件)。
但是,在将值存储在计数器中时一切顺利,但是当我想要使用 sum(Counter.values()) 添加计数器中存在的值时,它会引发错误,显示“'float' object has no attribute 'values'”。我也已经查阅了手册,它们也说对于整数值是可能的。但是是否有任何方法可以在计数器中添加浮点值呢?

1
你能提供一些代码吗?如果你只需要总数,为什么要使用“Counter”? - Will Vousden
2
看起来你没有使用 collections.Counter,所以你应该在问题中澄清 Counter 是什么。顺便说一句,如果你使用的是 Python2(而不是 Python3),Raymond Hettinger 有一个相当棒的后移配方 - Hank Gay
3个回答

8

为什么要使用计数器对象来汇总文件中的值? 它的明确目的是“计算可哈希对象”(即,如果您有多个离散对象想要计算实例)。

如果您想存储每个文件中浮点值的总和,请尝试使用普通字典:

floatsums = {}
floatsums['file1.txt'] = ... // insert code to sum the floats

total = sum(floatsums.values())
numfiles = len(floatsums)

5

尽管文档上说不行,但是将浮点数放入Counter中完全没有问题。你可以自己试试。

    from collections import Counter

    a = Counter()
    a['a'] += 1
    a['a'] += 0.1
    a['b'] += 0.1
    print(list(a.items()))

在Python 3中,至少如此。这样可以给予……
    [('a', 1.1), ('b', 0.1)]

这在Python 2和3中均有效。当然,由于文档没有说明这一点,因此从技术上讲,它是未定义的行为,所以它可能在将来的版本中无法工作,但我不认为会出现这种情况。 不过,如果您想完全符合规范,可以这样做:

    from collections import defaultdict

    a = defaultdict(float)

这将为您提供与上述相同的结果,并且仅使用文档化功能。

加一分给defaultdict的解决方案,但减一分给未记录的解决方案。使用未记录的功能可能不是一个好主意。 - towi

4
更简单的方法如下:
from collections import defaultdict
sums = defaultdict(lambda: 0)

那么:

sums['a'] += 1.

甚至更好的做法是使用sums = defaultdict(int),但这并不是一个好答案。使用Collection可以以更高效和更好的API完成相同的操作。 - Joel Croteau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接