如何在python 3中创建所有字母(az)的txt频率计数器

add*_*tes 8 python python-3.x

我有一个名为textf的文本文件,如下所示:

rxgmgcwbd c qcyurr bkxgmq, lwrg grru rrwxtam rwgzwt am quyam cv avrrgdwkxgcr.iwxbdamcz xdalguj qarc ram av vcmfwgmgum. yw'g
Run Code Online (Sandbox Code Playgroud)

我想对文本文件中的每个字母进行频率计数,但我希望它的条件是如果文本中没有出现字母,它应该有一个键值:值为0.例如,如果z不是在文本中它应该看起来像'z':0等等所有字母(a到z).我做了以下代码:

import string  
from collections import Counter 
with open("textf.txt") as tf: 
    letter = tf.read()
letter_count = Counter(letter.translate(str.maketrans('','',string.punctuation)))
print("Frequency count of letter:","\n",letter_count)
Run Code Online (Sandbox Code Playgroud)

但输出看起来像这样:

Counter({' ': 110, 'r': 12, 'c': 88, 'a': 55, 'g': 57, 'w': 76, 'm': 76, 'x': 72, 'u': 70, 'q': 41, 'y': 40, 'j': 36, 'l': 32, 'b': 18, 'd': 28, 'v': 27, 'k': 22, 't': 19, 'f': 18, 'z': 16, 'i': 7})
Run Code Online (Sandbox Code Playgroud)

我试图这样做,以便空间计数' ': 110没有显示,我有所有字母(az),当字母没有出现在文本中,我的结果打印出类似的东西'n': 0等等.关于如何使这成为可能的任何想法或建议?

PM *_*ing 9

一种方法是使用小写字母作为新词典的键,从你的计数器制作一个普通的词典.我们使用该dict.get方法为缺失的字母提供默认值零.

import string  
from collections import Counter 

letter = "rxgmgcwbd c qcyurr bkxgmq, lwrg grru rrwxtam rwgzwt am quyam cv avrrgdwkxgcr.iwxbdamcz xdalguj qarc ram av vcmfwgmgum. yw'g"

letter_count = Counter(letter.translate(str.maketrans('','',string.punctuation)))
letter_count = {k: letter_count.get(k, 0) for k in string.ascii_lowercase}
print("Frequency count of letter:\n", letter_count)
Run Code Online (Sandbox Code Playgroud)

产量

Frequency count of letter:
 {'a': 9, 'b': 3, 'c': 8, 'd': 4, 'e': 0, 'f': 1, 'g': 12, 'h': 0, 'i': 1, 'j': 1, 'k': 2, 'l': 2, 'm': 10, 'n': 0, 'o': 0, 'p': 0, 'q': 4, 'r': 14, 's': 0, 't': 2, 'u': 5, 'v': 4, 'w': 9, 'x': 6, 'y': 3, 'z': 2}
Run Code Online (Sandbox Code Playgroud)

如果你在Python 3.6+中执行此操作,则会获得新字典按字母顺序排序的附带好处(尽管该行为目前只是一个不应该依赖的实现细节).


正如user2357112在评论中提到的那样,我们不需要使用letter_count.get(k, 0),因为如果我们尝试读取不存在的键的值,则计数器自动返回零.所以dict理解可以改为

letter_count = {k: letter_count[k] for k in string.ascii_lowercase}
Run Code Online (Sandbox Code Playgroud)


cod*_*der 8

你可以这样做:

x = "rxgmgcwbd c qcyurr bkxgmq, lwrg grru rrwxtam rwgzwt am quyam cv avrrgdwkxgcr.iwxbdamcz xdalguj qarc ram av vcmfwgmgum. yw'g"

import string

freq = {i:0 for i in string.ascii_lowercase}
for i in x:
    if i in freq:
        freq[i] += 1
Run Code Online (Sandbox Code Playgroud)

你也可以用字典理解来替换for循环(尽管因为它使用对我们尝试做的事情效率很低 - 但作为一种仅供参考的方式添加):count

freq = {i:x.count(i) for i in freq}
Run Code Online (Sandbox Code Playgroud)

结果如下:

{'a': 9, 'c': 8, 'b': 3, 'e': 0, 'd': 4, 'g': 12, 'f': 1, 'i': 1, 'h': 0, 'k': 2, 'j': 1, 'm': 10, 'l': 2, 'o': 0, 'n': 0, 'q': 4, 'p': 0, 's': 0, 'r': 14, 'u': 5, 't': 2, 'w': 9, 'v': 4, 'y': 3, 'x': 6, 'z': 2}
Run Code Online (Sandbox Code Playgroud)

  • 你丢失了6个字母. (2认同)

Mar*_*ans 7

您可以Counter()使用字典初始化.在这种情况下,字典理解用于将所有小写字母初始化为零.

update()letter遗嘱一起使用然后添加到这些现有值:

from collections import Counter 

letter = "hello world "
letter_counts = Counter({l:0 for l in string.ascii_lowercase})
letter_counts.update(letter.translate(str.maketrans('','',string.punctuation + ' ')))

print(letter_counts)
Run Code Online (Sandbox Code Playgroud)

给你:

Counter({'l': 3, 'o': 2, 'd': 1, 'w': 1, 'h': 1, 'r': 1, 'e': 1, 'p': 0, 'c': 0, 'j': 0, 'x': 0, 't': 0, 'g': 0, 'n': 0, 'f': 0, 'u': 0, 'm': 0, 'q': 0, 'z': 0, 's': 0, 'y': 0, 'a': 0, 'b': 0, 'i': 0, 'k': 0, 'v': 0})
Run Code Online (Sandbox Code Playgroud)

要删除空格,请将其添加到标点字符串中.