Python编程求助:统计文件中粉丝数最多的用户名
看起来你在处理粉丝统计的问题时遇到了不少麻烦,我来一步步帮你解决这个问题,包括支持特殊字符的情况。
核心需求回顾
先明确我们要实现的目标:
- 从
follows.txt读取数据,每行格式为「用户名 + 其关注的用户列表」(允许单行只有用户名,代表该用户未关注任何人) - 统计每个用户的粉丝数(即有多少人关注了他)
- 找出粉丝数最多的用户;若有并列,按字母数字顺序输出所有并列用户
- 支持包含
#、@等非字母数字字符的用户名
你之前代码的问题分析
你的尝试代码存在几个关键逻辑和语法错误:
- 用元组
count = ()作为计数容器:元组是不可变类型,根本无法用来累加计数,应该用字典存储每个用户的粉丝数 - 遍历字符而非单词:
for word in line:会逐字符遍历行内容,而非拆分出每个用户名,需要用line.split()拆分单词 - 逻辑混淆:没有正确关联「关注者」和「被关注者」,应该给被关注的用户增加粉丝数,而非无差别计数
- 赋值与比较混用:
maxCount == count是比较操作,赋值应该用maxCount = count
完整解决方案代码
下面是可以直接运行的代码,我会逐行解释细节:
# 初始化字典,存储每个用户的粉丝数:键=用户名,值=粉丝数 follower_counts = {} # 打开文件,指定utf-8编码兼容特殊字符 with open('follows.txt', 'r', encoding='utf-8') as f: for line in f: # 去除行首尾空白(如换行符),按空格拆分成单词列表 parts = line.strip().split() if not parts: continue # 跳过空行 # 拆分当前用户(关注者)和他关注的用户列表 current_user = parts[0] followed_users = parts[1:] # 给每个被关注的用户增加粉丝数 for user in followed_users: if user in follower_counts: follower_counts[user] += 1 else: follower_counts[user] = 1 # 首次出现的用户初始化为1 # 【可选】统计所有出现过的用户(包括无粉丝的用户) all_users = set() with open('follows.txt', 'r', encoding='utf-8') as f: for line in f: parts = line.strip().split() all_users.update(parts) # 给无粉丝的用户设置粉丝数为0 for user in all_users: if user not in follower_counts: follower_counts[user] = 0 # 处理无数据的情况 if not follower_counts: print("未读取到任何用户数据") else: # 找出最大粉丝数 max_count = max(follower_counts.values()) # 收集所有粉丝数等于最大值的用户 top_users = [user for user, count in follower_counts.items() if count == max_count] # 按字母数字顺序排序 top_users_sorted = sorted(top_users) # 输出结果 print("粉丝数最多的用户:") for user in top_users_sorted: print(f"- {user} (粉丝数:{max_count})")
代码细节说明
粉丝数统计逻辑:
- 用字典
follower_counts精准记录每个用户的粉丝数,遍历每行时,给当前用户关注的所有人各加1粉丝 - 加入空行处理,避免空行导致的索引错误
- 用字典
特殊字符支持:
- 我们用
split()按空格拆分内容,只要用户名是单个「无空格的字符串」,不管包含#、@还是其他特殊字符,都能被正确识别和统计,无需额外处理
- 我们用
并列用户排序:
- 用
sorted(top_users)对并列用户排序,Python默认的字符串排序遵循ASCII码顺序,完全符合字母数字排序要求(比如a在b前,1在a前)
- 用
文件读取问题解决:
- 确保
follows.txt和脚本在同一目录,或使用绝对路径(如C:/Users/xxx/follows.txt) - 加上
encoding='utf-8'参数,避免特殊字符导致的编码错误
- 确保
测试示例输入
针对你提供的示例follows.txt内容(假设每行结构为:
andrew fred fred judy andrew fred george judy andrew john george
),运行代码后会得到:
粉丝数最多的用户: - andrew (粉丝数:2) - fred (粉丝数:2)
内容的提问来源于stack exchange,提问作者Benjamin Hambly
相关产品推荐
相关产品推荐

