1

如何计算文本文件中给出的数字的频率。文本文件如下。

     0
     2
     0
     1
     0
     1
     55
     100
     100

我想要输出如下

     0   3
     1   2
     2   1
     55  1
     100 2

我试过这个没有成功

     def histogram( A, flAsList=False ):
         """Return histogram of values in array A."""
         H = {}
         for val in A:
             H[val] = H.get(val,0) + 1
         if flAsList:
             return H.items()
         return H

有什么更好的办法。提前致谢!

4

4 回答 4

4

使用计数器。这是解决此类问题的最佳方法

from collections import Counter
with open('file.txt', 'r') as fd:
    lines = fd.read().split()
    counter = Counter(lines)
    # sorts items
    items = sorted(counter.items(), key=lambda x: int(x[0]))
    # prints desired output
    for k, repetitions in items:
        print k,'\t', repetitions

输出:

0   3
1   2
2   1
55  1
100 2
于 2013-09-14T17:22:39.273 回答
1

Counter为此使用一个对象:

from collections import Counter
c = Counter(A)

现在该c变量将保存每个值的频率图。例如:

Counter(['a', 'b', 'c', 'a', 'c', 'a'])
=> Counter({'a': 3, 'c': 2, 'b': 1})
于 2013-09-14T17:23:34.623 回答
1

请考虑使用更新

def histogram( A, flAsList=False ):
 """Return histogram of values in array A."""
 H = {}
 for val in A:
     # H[val] = H.get(val,0) + 1
     if H.has_key(val):
        H[val] = H[val] + 1
     else:
        H.update({val : 1})
 if flAsList:
     return H.items()
 return H
于 2013-09-14T17:29:26.840 回答
1

使用字典的简单方法:

histogram = {}

with open("file","r") as f:
    for line in f:
        try:
            histogram[line.strip()] +=1
        except KeyError:
            histogram[line.strip()] = 1

for key in sorted(histogram.keys(),key=int):
    print key,"\t",histogram[key]

输出:

0       3
1       2
2       1
55      1
100     2

编辑:

要选择特定列,您希望使用 分割行split()。例如,通过在单个空格上拆分的第六个字段:

try:
    histogram[line.strip().split(' ')[5]] +=1
except KeyError:
    histogram[line.strip().split(' ')[5]] = 1
于 2013-09-14T17:31:04.247 回答