Python统计文件中被转推最多的Top N用户问题求助
嘿,我来帮你找出代码里的问题并修正它~
你的代码核心问题
你现在的代码犯了两个关键错误,导致结果不符合预期:
- 统计对象搞反了:你统计的是发出转推的用户,但题目要求的是被转推次数最多的用户。
- 转推识别与用户提取逻辑错误:你用
i.strip().split(' ', 2)[1] in ('RT @ ')来判断转推,这个条件完全没法正确识别转推消息,更没法提取到被@的目标用户。
修正后的完整代码
下面是修复后的代码,我还加了一些健壮性处理(比如空行、文件不存在的情况):
from collections import Counter from pathlib import Path def main(): # 获取并验证用户输入的N n_input = input('Enter n: ') try: n = int(n_input) except ValueError: print('Invalid input.') return # 读取文件内容,处理文件不存在的情况 file_path = Path('stream.txt') try: lines = file_path.read_text().strip().split('\n') except FileNotFoundError: print(f"Error: 文件 {file_path} 不存在!") return # 收集所有被转推的用户 retweeted_users = [] for line in lines: line = line.strip() if not line: # 跳过空行 continue # 拆分出发信用户和消息内容(只拆1次,避免消息里的空格干扰) parts = line.split(' ', 1) if len(parts) < 2: continue # 跳过格式不正确的行 _, message = parts # 我们不需要发信用户,所以用下划线忽略 # 判断是否是转推消息 if message.startswith('RT @'): # 提取被转推的用户名:从"RT @user: ..."中截取合法用户名 user_part = message[4:] # 跳过开头的"RT @" retweeted_user = '' # 只保留用户名的合法字符(字母、数字、下划线) for char in user_part: if char.isalnum() or char == '_': retweeted_user += char else: break if retweeted_user: retweeted_users.append(retweeted_user) # 处理无转推记录的情况 if not retweeted_users: print("没有找到转推记录。") return # 统计被转推次数并排序 count = Counter(retweeted_users) # 按次数降序排序,次数相同则按用户名升序(可选,让结果更整齐) sorted_results = sorted(count.items(), key=lambda x: (-x[1], x[0])) # 输出前N个结果(每个用户单独一行) displayed = 0 for user, cnt in sorted_results: if displayed >= n: break print(f"{cnt} {user}") displayed += 1 if __name__ == '__main__': main()
关键修正点说明
- 正确识别转推:用
message.startswith('RT @')精准判断转推消息,避免误判。 - 提取被转推用户:从
RT @之后截取合法的用户名(考虑到用户名后可能跟着冒号或空格),确保拿到的是正确的被转推对象。 - 统计正确对象:现在统计的是被@的用户,而不是发转推的用户,完全符合题目要求。
- 健壮性优化:处理了空行、格式错误的行、文件不存在、无转推记录等边缘情况,让程序更稳定。
比如如果你的stream.txt里有这些数据:
alice RT @fred: hello bob RT @fred: hi charlie RT @judy: hey david DM @andy: private
运行输入n=10后,输出会和你给出的示例一致:
Enter n: 10 2 fred 1 judy
内容的提问来源于stack exchange,提问作者Soshi
相关产品推荐
相关产品推荐

