在 python 中,如何遍历文本文件并计算每个字母的出现次数?我意识到我可以使用“for x in file”语句来完成它,然后设置 26 个左右的 if elif 语句,但肯定有更好的方法吗?
谢谢。
from collections import Counter
with open(file) as f:
c = Counter()
for line in f:
c += Counter(line)
如果文件不是那么大,可以将其全部作为字符串读入内存,并Counter
在一行代码中将其转换为对象:
c = Counter(f.read())
例子:
>>> c = Counter()
>>> c += Counter('aaabbbcccddd eee fff ggg')
>>> c
Counter({'a': 3, ' ': 3, 'c': 3, 'b': 3, 'e': 3, 'd': 3, 'g': 3, 'f': 3})
>>> c += Counter('aaabbbccc')
Counter({'a': 6, 'c': 6, 'b': 6, ' ': 3, 'e': 3, 'd': 3, 'g': 3, 'f': 3})
或者使用count()
字符串的方法:
from string import ascii_lowercase # ascii_lowercase =='abcdefghijklmnopqrstuvwxyz'
with open(file) as f:
text = f.read().strip()
dic = {}
for x in ascii_lowercase:
dic[x] = text.count(x)
使用字典 - 基本上letters[char]++
这种方式为每个字符创建字典直方图,可用于创建条形图或类似图。如果要将其限制为字母或某个子集,则需要freqs
在末尾添加额外的条件或过滤器。
freqs = {}
with open('your_filename.txt') as f:
for line in f:
for char in line:
if char in freqs:
freqs[char] += 1
else:
freqs[char] = 1
print(freqs)
您还可以使用以下方法编写相同的逻辑dict.setdefault
:
freqs = {}
with open('your_filename.txt') as f:
for line in f:
for char in line:
freqs.setdefault(char, 0)
freqs[char] += 1
from collections import defaultdict
freqs = defaultdict(int)
with open('your_filename.txt') as f:
for line in f:
for char in line:
freqs[char] += 1
基本上,没有导入: is_letter 是一个函数来确定某事物是否是字母,这样您就可以计算除通常的英文字母之外的其他事物
def add_or_init(dictionary, c):
if(c in dictionary):
dictionary[c]+=1
else:
dictionary[c]=1
def count_one_letter(dictionary, c, is_letter):
if is_letter(c):
add_or_init(dictionary, c)
def count_letters(dictionary, string, is_letter):
for c in string:
count_one_letter(dictionary, c, is_letter)
return dictionary
#count all characters
count_letters(dict(),'aaabbbcccddd eee fff ggg',lambda x: True)
# => {'a': 3, ' ': 3, 'c': 3, 'b': 3, 'e': 3, 'd': 3, 'g': 3, 'f': 3}
Counter 是实现此目的的好方法,但 Counter 仅在 3.1 及更高版本以及 2.7 中可用。
如果您使用的是 3.0 或 2.[56],您可能应该使用 collections.defaultdict(int) 代替。