如标题所说:
到目前为止,我的代码确实可以工作,但是我无法按顺序显示信息。目前它只是随机显示信息。
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]))
任何帮助都将不胜感激。
看起来你正尝试按字母频率显示文本中的字母出现次数,并且希望按顺序显示这些信息。然而,代码中存在几个问题,导致输出不按预期的顺序显示。我将帮助你修复这些问题,并确保按顺序输出字母的频率。
content.count(letter) 的重复计数:你在循环中每次遇到字母时,都会计算整个文本中该字母的数量,这非常低效,并且会导致重复的计数。
content.count(letter)
按顺序输出问题:你没有排序频率统计结果,所以它们会被随机显示。为了按字母顺序或频率顺序显示,需要对字典进行排序。
字母小写化的方式:你将整个 content 转为小写,但没有在循环中逐个字符处理时保持一致的转换。
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.")
统计频率:遍历 content 中的每个字符,如果它不在 invalid 字符列表中,我们将它的计数添加到 wordcount 字典中。如果字母已经存在,则递增其计数。
invalid
wordcount
排序:使用 sorted(wordcount.items()) 将字母按字母顺序排序,并将排序结果转换回字典 sorted_wordcount。
sorted(wordcount.items())
sorted_wordcount
输出格式:打印每个字母及其出现的次数,按照字母顺序显示。
假设你的文件内容是 "Hello, World!",程序的输出应该是:
"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.")
希望这个改进后的代码能解决你的问题!