我需要用带数字的文本文件制作一个字典。密钥应该是数字,属性应该是文档中存在该数字的次数。
然而,如果不搞砸我的柜台,我似乎无法做到这一点。这就是我的尝试:
def number_frequency(filename):
dic={}
with open(filename, "r+") as f:
for line in f:
if line not in dic.keys():
dic[line.rstrip('\n')]=int(1)
elif line in dic.keys():
dic[line.rstrip('\n')]+=1
return dic
像这样的文件
1
2
3
4
5
5
5
5
打印出来:
{'1': 1, '5': 2, '4': 1, '2': 1, '3': 1}
我如何解决这个问题?
答案 0 :(得分:0)
您可以先从内容中用空格\n
替换" "
,然后将内容转换为数字列表,然后使用collections.Counter()
查找计数。以下是代码示例:
import StringIO
from collections import Counter
f = StringIO.StringIO("""
1 2 3 4 5 6 \n
7 8 9 1 4 5 \n
1 7 4 7 9 3""") # Here f is the file like object
# Your logic starts from here
num_list = f.read().replace('\n', ' ').split()
my_counter = Counter(num_list)
# content of `my_counter`:
{
'1': 3,
'4': 3,
'7': 3,
'3': 2,
'5': 2,
'9': 2,
'2': 1,
'6': 1,
'8': 1
}
答案 1 :(得分:0)
使用strip
和collections.Counter
。
from collections import Counter
with open(filename) as f:
c=Counter(map(str.strip, f.readlines())) #or rstrip. map for conciseness
答案 2 :(得分:0)
您可以使用收集模块中的Counter
,它就是这样做的。
如果您的数据是可靠的(没有奇怪的字符),使用int
构造函数将为您删除\ n。
首先,您将这些行作为列表(如果文件大于您的内存,请不要这样做)。
然后使用map(或列表理解/生成器:[int(n) for n in num_list]
(int(n) for n in num_list)
,然后将此列表传递给Counter
from collections import Counter
with open("number.txt") as f:
num_list = f.readlines()
c = Counter(map(int, num_list))
print(c)
答案 3 :(得分:0)
不要离原始代码太远,我提供此。
from collections import defaultdict
def number_frequency(filename):
dic = defaultdict(int)
with open(filename, 'r') as f:
for line in f:
line=line.rstrip()
dic[line]+=1
return dic
print ( number_frequency('temp.txt') )
答案 4 :(得分:-1)
def number_frequency(filename):
dic={}
with open(filename, "r+") as f:
for line in f:
if "\n" in line:
line=line[:-1]
if line not in dic.keys():
dic[line]=int(1)
elif line in dic.keys():
dic[line]+=1
return dic