
本文介绍如何正确统计用户输入的一行文本中每个单词的出现次数,并按原始顺序逐行输出“单词 频次”,重点纠正初学者常见的重复计数与输出逻辑错误。
你的原始代码存在两个关键问题:
- word_count = each_word.count(x) 在循环外计算,导致 word_count 最终只保留最后一个单词的计数结果(即 "mark" 出现 1 次),并被统一打印一次;
- *`print(each_word, word_count)`** 将所有单词展开后拼接一个数字,完全偏离了“每词一行、带各自频次”的输出格式。
✅ 正确思路是:对 split() 得到的每个单词 x,在循环体内即时统计其在整个字符串中的出现次数,并立即打印。注意——必须基于原始输入字符串(而非 each_word 列表)调用 .count(),否则大小写敏感问题(如 "hi" 和 "mark")会被误判(列表中 "hi" 出现 2 次,但 "mark" 是小写,与 "Mark" 不同)。
以下是修正后的完整可运行代码:
phrase = input().strip() # 读入并去除首尾空格
words = phrase.split()
for word in words:
count = phrase.count(word) # ✅ 在原始字符串上统计,保持大小写原貌
print(f"{word} {count}")? 运行示例:
输入:hey hi Mark hi mark
输出:
hey 1 hi 2 Mark 1 hi 2 mark 1
⚠️ 注意事项:
立即学习“Python免费学习笔记(深入)”;
- 该方法区分大小写("Mark" ≠ "mark"),符合题目样例预期;若需忽略大小写,可统一转为 .lower() 后处理;
- .count() 对长文本效率较低(时间复杂度 O(n²)),生产环境推荐使用 collections.Counter 配合字典预统计(单次遍历 O(n)),但本题强调“按输入顺序输出”,故直接计数更直观;
- 不要使用 dict 预存频次再循环输出——这会丢失重复单词的多次出现位置,无法满足“每个词单独一行”的输出要求(如 "hi" 必须输出两次)。
总结:掌握“循环中即时计算 + 即时输出”这一模式,是解决此类顺序敏感型频次统计问题的关键。










