如何用Python按用户分组并统计各用户的粉丝列表?
解决粉丝统计的代码问题
你的代码逻辑完全搞反啦!现在的写法是把每一行里的所有用户都绑定了该行的被关注列表,这和我们需要的**「记录每个用户的粉丝是谁」**的需求正好相反。
问题出在哪?
看你的代码片段:
for aUser in allUsers[0:]: aCompleteUserDict[aUser] = allUsers[1:]
比如第一行tony tom frank,你会把tony、tom、frank的value全设为['tom','frank'];后面遇到tom tony jordan时,又会把tom、tony、jordan的value改成['tony','jordan'];最后一行tom frank又会把该行所有用户的value改成['frank']——这就是为什么你的输出完全不符合预期。
正确的代码实现
我们需要的核心逻辑是:每行第一个用户是「粉丝」,后面的是他「关注的人」,要把这个粉丝添加到每个被关注者的粉丝列表里。代码如下:
with open("sample.txt", 'r') as fhand: fan_dict = {} for line in fhand: # 去掉首尾空白后分割,避免空行或多余空格的问题 parts = line.strip().split() if not parts: continue # 跳过空行 fan = parts[0] followed_users = parts[1:] # 遍历每个被关注的用户,把当前粉丝加入他们的粉丝列表 for user in followed_users: if user not in fan_dict: fan_dict[user] = [] fan_dict[user].append(fan) # 确保粉丝自己也在字典中(如果没人关注他的话) if fan not in fan_dict: fan_dict[fan] = [] print(fan_dict)
输出结果
运行这段代码后,会得到你期望的结果:
{'tom': ['tony', 'frank'], 'frank': ['tony', 'jordan', 'tom'], 'tony': ['tom', 'frank'], 'jordan': ['tom']}
(注:列表内的顺序是按粉丝出现的先后排列的,和你给出的期望输出顺序略有不同,但内容完全一致,不影响统计分析)
代码解释
- 初始化字典:
fan_dict用来存储每个用户对应的粉丝列表。 - 处理每行数据:用
strip()去掉换行符和首尾空格,再用split()分割成用户列表,避免空行或多余空格干扰。 - 提取核心角色:
parts[0]是当前行为的粉丝,parts[1:]是他关注的所有人。 - 更新粉丝列表:对每个被关注者,若还没在字典里就创建空列表,然后把当前粉丝添加进去。
- 补全所有用户:确保粉丝自己也在字典中,避免出现某个用户只有关注行为但没被关注时,不在结果里的情况。
内容的提问来源于stack exchange,提问作者Louis
相关产品推荐
相关产品推荐

