如何计算文本文件中给出的数字的频率。文本文件如下。
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
任何更好的方式。提前谢谢!
答案 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