如何用Python统计文本文件中非转发/私信的Top N原创发帖用户?
如何统计原创发帖量Top N用户(Twitter风格数据)
嘿,我来帮你搞定这个需求!咱们先把要做的事情拆解清楚,再一步步重构代码:
核心需求拆解
咱们要实现的功能有这几个关键点:
- 只统计原创帖子:排除消息以
RT(转发)或DM(私信)开头的内容 - 计算每个用户的原创发帖数量
- 接收用户输入的
n,输出发帖量最多的前n位用户 - 排序规则:先按发帖量降序排列,发帖量相同的用户按字典序升序排列
- 输出要做到列对齐,看起来更规整
代码重构思路
原来的代码是统计所有单词的词频,和咱们的需求完全不匹配,所以需要彻底重构统计逻辑:
- 筛选原创帖子:遍历每一行,把用户名和消息内容分开,判断消息开头是不是
RT/DM,只有非转发/非私信的内容才计入用户的发帖数 - 统计用户发帖量:用字典记录每个用户的原创帖子数量
- 自定义排序规则:用负的发帖量实现降序,同时把用户名作为次要排序键保证字典序
- 接收用户输入:用
input()获取n并转成整数 - 格式化输出:用格式化字符串实现列对齐
完整实现代码
# 初始化用户原创发帖计数器 user_post_counts = {} # 安全读取文件(自动关闭文件句柄) with open('streamt.txt', 'r') as file: for line in file: line = line.strip() if not line: continue # 跳过空行,避免报错 # 分割用户名和消息内容:只分割一次,确保消息里的空格不影响 parts = line.split(maxsplit=1) username = parts[0] # 容错处理:防止没有消息内容的行 if len(parts) < 2: continue message = parts[1] # 判断是否为原创帖子:消息不以RT或DM开头 message_words = message.split() if not message_words: continue first_message_word = message_words[0] if first_message_word not in ('RT', 'DM'): # 更新用户计数:不存在则初始化为0再加1 user_post_counts[username] = user_post_counts.get(username, 0) + 1 # 接收用户输入的n n = int(input("Enter n: ")) # 排序:先按发帖量降序,相同数量按用户名字典序升序 # 用(-count, username)作为排序键,利用Python排序的稳定性实现需求 sorted_users = sorted( user_post_counts.items(), key=lambda item: (-item[1], item[0]) ) # 输出前n个用户,列对齐显示 for username, count in sorted_users[:n]: print(f"{count:3d} {username}")
测试运行结果
运行代码后输入10,输出和期望完全一致:
Enter n: 10 3 andrew 2 fred 1 john 1 judy
关键细节说明
split(maxsplit=1):这个方法能精准分割用户名和消息,不管消息里有多少空格都不会出错- 排序键
lambda item: (-item[1], item[0]):负号让发帖量降序排列,用户名作为次要键保证相同数量的用户按字典序排列 f"{count:3d}":格式化数字占3个字符宽度,轻松实现列对齐效果with open():比直接open()更安全,不需要手动关闭文件,避免资源泄漏
内容的提问来源于stack exchange,提问作者Soshi
相关产品推荐
相关产品推荐

