我有一个名为textf的文本文件,看起来类似于以下内容:
rxgmgcwbd c qcyurr bkxgmq, lwrg grru rrwxtam rwgzwt am quyam cv avrrgdwkxgcr.iwxbdamcz xdalguj qarc ram av vcmfwgmgum. yw'g
我想对文本文件中的每个字母进行频率计数,但我希望这样做的条件是,如果文本中未出现字母,则该字母应具有值为0的key:value对。例如,如果z不是在文本中,所有字母(a到z)的外观应类似于“ z”:0,依此类推。我做了以下代码:
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)
但是输出看起来像这样:
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})
我正在尝试这样做,以便' ': 110
不显示空格计数,并且我拥有所有字母(az),并且当字母未出现在文本中时,我的结果将显示类似的'n': 0
内容。关于如何使之成为可能的任何想法或建议?
一种方法是使用小写字母作为新字典的键,从计数器中制作普通字典。我们使用该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)
输出
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}
如果在Python 3.6及更高版本中执行此操作,则将获得新的dict按字母顺序排序的附带好处(尽管当前的行为只是不应该依赖的实现细节)。
正如user2357112在注释中提到的,我们不需要使用letter_count.get(k, 0)
,因为如果我们尝试读取不存在的键的值,则Counter会自动返回零。这样可以将dict理解更改为
letter_count = {k: letter_count[k] for k in string.ascii_lowercase}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句