6

在 python 中,如何遍历文本文件并计算每个字母的出现次数?我意识到我可以使用“for x in file”语句来完成它,然后设置 26 个左右的 if elif 语句,但肯定有更好的方法吗?

谢谢。

4

5 回答 5

16

使用collections.Counter()

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)
于 2012-09-09T19:26:59.477 回答
3

使用字典 - 基本上letters[char]++

于 2012-09-09T19:26:29.870 回答
1

这种方式为每个字符创建字典直方图,可用于创建条形图或类似图。如果要将其限制为字母或某个子集,则需要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

或使用collections.defaultdict

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
于 2012-09-09T19:40:18.190 回答
0

基本上,没有导入: 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}
于 2012-09-09T19:53:41.540 回答
0

Counter 是实现此目的的好方法,但 Counter 仅在 3.1 及更高版本以及 2.7 中可用。

如果您使用的是 3.0 或 2.[56],您可能应该使用 collections.defaultdict(int) 代替。

于 2012-09-09T19:38:25.150 回答