我有一个名为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等等.关于如何使这成为可能的任何想法或建议?
一种方法是使用小写字母作为新词典的键,从你的计数器制作一个普通的词典.我们使用该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)
你可以这样做:
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)
您可以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)
要删除空格,请将其添加到标点字符串中.
| 归档时间: |
|
| 查看次数: |
1293 次 |
| 最近记录: |