小能豆

我正在尝试计算 txt 文件中的所有字母,然后按降序显示

py

如标题所说:

到目前为止,我的代码确实可以工作,但是我无法按顺序显示信息。目前它只是随机显示信息。

def frequencies(filename):
    infile=open(filename, 'r')
    wordcount={}
    content = infile.read()
    infile.close()
    counter = {}
    invalid = "‘'`,.?!:;-_\n—' '"

    for word in content:
        word = content.lower()
        for letter in word:
            if letter not in invalid:
                if letter not in counter:
                    counter[letter] = content.count(letter)
                    print('{:8} appears {} times.'.format(letter, counter[letter]))

任何帮助都将不胜感激。


阅读 7

收藏
2024-11-14

共1个答案

小能豆

看起来你正尝试按字母频率显示文本中的字母出现次数,并且希望按顺序显示这些信息。然而,代码中存在几个问题,导致输出不按预期的顺序显示。我将帮助你修复这些问题,并确保按顺序输出字母的频率。

主要问题:

  1. content.count(letter) 的重复计数:你在循环中每次遇到字母时,都会计算整个文本中该字母的数量,这非常低效,并且会导致重复的计数。

  2. 按顺序输出问题:你没有排序频率统计结果,所以它们会被随机显示。为了按字母顺序或频率顺序显示,需要对字典进行排序。

  3. 字母小写化的方式:你将整个 content 转为小写,但没有在循环中逐个字符处理时保持一致的转换。

修复方案:

  • 我们会去除不必要的重复计数,直接统计每个字母的出现次数。
  • 我们会按字母顺序或频率排序输出结果。

改进后的代码:

def frequencies(filename):
    infile = open(filename, 'r')
    wordcount = {}
    content = infile.read()
    infile.close()

    # 无效字符,应该忽略它们
    invalid = "‘'`,.?!:;-_\n—' "

    # 将文本转换为小写
    content = content.lower()

    # 统计每个字母的频率
    for letter in content:
        if letter not in invalid:
            if letter not in wordcount:
                wordcount[letter] = 1
            else:
                wordcount[letter] += 1

    # 按字母顺序对字母进行排序
    sorted_wordcount = dict(sorted(wordcount.items()))

    # 打印结果
    for letter, count in sorted_wordcount.items():
        print(f"{letter:8} appears {count} times.")

主要修改点:

  1. 统计频率:遍历 content 中的每个字符,如果它不在 invalid 字符列表中,我们将它的计数添加到 wordcount 字典中。如果字母已经存在,则递增其计数。

  2. 排序:使用 sorted(wordcount.items()) 将字母按字母顺序排序,并将排序结果转换回字典 sorted_wordcount

  3. 输出格式:打印每个字母及其出现的次数,按照字母顺序显示。

输出示例:

假设你的文件内容是 "Hello, World!",程序的输出应该是:

d        appears 1 times.
e        appears 1 times.
h        appears 1 times.
l        appears 3 times.
o        appears 2 times.
r        appears 1 times.
w        appears 1 times.

性能改进:

如果你的文件非常大,可以考虑按行读取文件,而不是一次性读取整个文件,这样可以减少内存使用:

def frequencies(filename):
    wordcount = {}

    with open(filename, 'r') as infile:
        for line in infile:
            line = line.lower()
            for letter in line:
                if letter not in "‘'`,.?!:;-_\n—' ":
                    wordcount[letter] = wordcount.get(letter, 0) + 1

    sorted_wordcount = dict(sorted(wordcount.items()))
    for letter, count in sorted_wordcount.items():
        print(f"{letter:8} appears {count} times.")

总结:

  1. 通过逐字符统计频率并去除无效字符,我们有效地计算了每个字母的出现次数。
  2. 使用字典排序来确保输出按字母顺序显示。
  3. 提供了按行读取文件的选项,以提高性能和内存效率。

希望这个改进后的代码能解决你的问题!

2024-11-14