首先以只读方式打开单词文件,利用列表推导式创建两个列表
列表sta记录各单词出现的次数,列表freq记录各单词出现的频率

f = open('5500词.txt','r',encoding='utf-8')
sta = [0 for i in range(26)]
freq = [0 for i in range(26)]

单词格式如下所示:
a [ei] art.一(个);每一(个);(同类事物中)任一个
abandon [ə’bændən] vt.离弃,丢弃;遗弃,抛弃;放弃
abdomen [æb’dəumen] n.腹,下腹(胸部到腿部的部分)
abatement [ə’beitmənt] n.减(免)税,打折扣,冲销
abide [ə’baid] vi.(abode,abided)(by)遵守;坚持;vt.忍受,容忍

每行一个单词,所以我们选择按行读取文件

for i in range(5500):
    buf = f.readline()

然后依次统计每个字符串中的字母个数,注意大写字母也要统计(后面的字母省略)

for j in buf:
        if j == 'a' or j == 'A':
            sta[0] = sta[0] + 1
        elif j == 'b' or j == 'B':
            sta[1] = sta[1] + 1

注意到每个单词后都有音标,所以遇到 中括号" [ "时停止计数

if j == '[':
            break

然后每五个一行,依次输出各个单词出现的次数,将print函数中的end参数由默认换行改成几个空格,使输出更格式化。字母利用ASCII码输出

print('5498个词汇中,各字母出现的次数分别为:\n')
asc = 97
for i in range(26):
    if i < 25:
        print("%c" % asc,':',sta[i],end='   ')
        if (i + 1) % 5 == 0:
            print('\n')
    else:
        print("%c" % asc,':',sta[i])
    asc = asc + 1

利用一个for遍历计算出所有字母数量的总和

sum = 0
for i in sta:
    sum = sum + i

利用一个for遍历计算出各字母出现的频率,注意到Python中计算出的频率会自动保留17位小数,为了方便查看,使用round()函数保留四位小数,值得注意的是,使用round()函数会自动去掉数字末尾的0

for i in range(26):
    freq[i] = round(sta[i] / sum,4)

再以每五个一行,依次输出各个单词出现的频率,将print函数中的end参数由默认换行改成几个空格,使输出更格式化。字母利用ASCII码输出。

print('各字母出现的频率分别为:\n')
for i in range(26):
    if i < 25:
        print("%c" % asc,':',freq[i],end='   ')
        if (i + 1) % 5 == 0:
            print('\n')
    else:
        print("%c" % asc,':',freq[i])
    asc = asc + 1

最后输出的结果如下图所示:
输出结果
上概率论的课时,偶然看见居然有人拿着词典去数字母的数量,就想能不能写一个自动统计的程序,于是就随便写着玩。代码功底很差,所以写得很丑(居然有25个elif),所以看个乐呵就好了。

总的来说,我觉得有这些可以改进的地方:
①读取单词的方法可以改进,这种一行一行读取的方式,对格式要求很高,很难找到
②用字典来存储频数和频率是否会更好?后面输出的时候可以避免使用ASCII码,但是字典推导式我属实记不清了
③判断计数的这些if和elif能否抽象出一个方法?增加代码复用
④round()函数会自动去掉小数后面的0,有没有什么方法使0被保留下来?这样输出的格式会更好看

我的代码的优点估计只有一点了:
①Python初学者就能看懂

如果你有什么改进的方法,请指出来,我将感激不尽;如果这篇文章能帮助到你,我更将不胜荣幸。

附:完整代码

f = open('5500词.txt','r',encoding='utf-8')
sta = [0 for i in range(26)]
freq = [0 for i in range(26)]
for i in range(5500):
    buf = f.readline()
    for j in buf:
        if j == 'a' or j == 'A':
            sta[0] = sta[0] + 1
        elif j == 'b' or j == 'B':
            sta[1] = sta[1] + 1
        elif j == 'c' or j == 'C':
            sta[2] = sta[2] + 1
        elif j == 'd' or j == 'D':
            sta[3] = sta[3] + 1
        elif j == 'e' or j == 'E':
            sta[4] = sta[4] + 1
        elif j == 'f' or j == 'F':
            sta[5] = sta[5] + 1
        elif j == 'g' or j == 'G':
            sta[6] = sta[6] + 1
        elif j == 'h' or j == 'H':
            sta[7] = sta[7] + 1
        elif j == 'i' or j == 'I':
            sta[8] = sta[8] + 1
        elif j == 'j' or j == 'J':
            sta[9] = sta[9] + 1
        elif j == 'k' or j == 'K':
            sta[10] = sta[10] + 1
        elif j == 'l' or j == 'L':
            sta[11] = sta[11] + 1
        elif j == 'm' or j == 'M':
            sta[12] = sta[12] + 1
        elif j == 'n' or j == 'N':
            sta[13] = sta[13] + 1
        elif j == 'o' or j == 'O':
            sta[14] = sta[14] + 1
        elif j == 'p' or j == 'P':
            sta[15] = sta[15] + 1
        elif j == 'q' or j == 'Q':
            sta[16] = sta[16] + 1
        elif j == 'r' or j == 'R':
            sta[17] = sta[17] + 1
        elif j == 's' or j == 'S':
            sta[18] = sta[18] + 1
        elif j == 't' or j == 'T':
            sta[19] = sta[19] + 1
        elif j == 'u' or j == 'U':
            sta[20] = sta[20] + 1
        elif j == 'v' or j == 'V':
            sta[21] = sta[21] + 1
        elif j == 'w' or j == 'W':
            sta[22] = sta[22] + 1
        elif j == 'x' or j == 'X':
            sta[23] = sta[23] + 1
        elif j == 'y' or j == 'Y':
            sta[24] = sta[24] + 1
        elif j == 'z' or j == 'Z':
            sta[25] = sta[25] + 1

        if j == '[':
            break
        pass

print('5498个词汇中,各字母出现的次数分别为:\n')
asc = 97
for i in range(26):
    if i < 25:
        print("%c" % asc,':',sta[i],end='   ')
        if (i + 1) % 5 == 0:
            print('\n')
    else:
        print("%c" % asc,':',sta[i])
    asc = asc + 1

print('\n')

sum = 0
for i in sta:
    sum = sum + i

for i in range(26):
    freq[i] = round(sta[i] / sum,4)
asc = 97
print('各字母出现的频率分别为:\n')
for i in range(26):
    if i < 25:
        print("%c" % asc,':',freq[i],end='   ')
        if (i + 1) % 5 == 0:
            print('\n')
    else:
        print("%c" % asc,':',freq[i])
    asc = asc + 1

f.close()

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐