You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python统计文件中被转推最多的Top N用户问题求助

嘿,我来帮你找出代码里的问题并修正它~

你的代码核心问题

你现在的代码犯了两个关键错误,导致结果不符合预期:

  1. 统计对象搞反了:你统计的是发出转推的用户,但题目要求的是被转推次数最多的用户。
  2. 转推识别与用户提取逻辑错误:你用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()

关键修正点说明

  1. 正确识别转推:用message.startswith('RT @')精准判断转推消息,避免误判。
  2. 提取被转推用户:从RT @之后截取合法的用户名(考虑到用户名后可能跟着冒号或空格),确保拿到的是正确的被转推对象。
  3. 统计正确对象:现在统计的是被@的用户,而不是发转推的用户,完全符合题目要求。
  4. 健壮性优化:处理了空行、格式错误的行、文件不存在、无转推记录等边缘情况,让程序更稳定。

比如如果你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:46:42