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

时间:2013-09-14 17:20:27

标签: python

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

     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 个答案:

答案 0 :(得分:4)

使用Counter。这是解决此类问题的最佳方式

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

答案 1 :(得分:1)

使用Counter对象:

from collections import Counter
c = Counter(A)

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

Counter(['a', 'b', 'c', 'a', 'c', 'a'])
=> Counter({'a': 3, 'c': 2, 'b': 1})

答案 2 :(得分: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

答案 3 :(得分: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