如何修正Python字典遍历代码以生成正确的用户视频评论汇总字典?
用户评论视频汇总字典重复覆盖问题
给定视频评论列表video_reviews,每个元素包含视频名称、浏览量及用户评论列表。需实现create_user_summary函数,生成以用户名为键、其评论过的所有视频列表为值的汇总字典。现有代码运行后出现AssertionError,部分用户的视频列表仅保留最后一条评论对应的视频,无法完整收集所有评论过的视频。
错误代码
def create_user_summary(video_reviews): summary = {} for video in video_reviews: for person in video["reviews"]: user = person["name"] video_name = [] if person["name"] == user: video_name.append(video["name"]) summary[user] = video_name return summary
错误输出
{'Jeb': ['All Fail'], 'Samantha': ['Runaway Nintendo'], 'Crystal': ['All Fail'], 'Frank': ['All Fail'], 'Bill': ['Runaway Nintendo'], 'Sarah': ['Runaway Nintendo']}
期望输出
{ "Jeb": ["Cats doing nothing", "All Fail"], "Samantha": ["Cats doing nothing","Runaway Nintendo"], "Crystal": ["Cats doing nothing", "All Fail"], "Frank": ["All Fail"], "Bill": ["Runaway Nintendo"], "Sarah": ["Runaway Nintendo"], }
问题原因
每次循环都会新建空列表video_name = [],并且通过summary[user] = video_name直接覆盖该用户已有的列表值。这导致用户每次评论新视频时,之前收集的视频列表都会被替换成仅包含当前视频的新列表,最终只保留最后一条评论对应的视频。
修正方案
需要判断用户是否已存在于汇总字典中:若不存在则创建空列表,若已存在则直接在已有列表中追加当前视频。
修正后代码(基础版)
def create_user_summary(video_reviews): summary = {} for video in video_reviews: current_video = video["name"] for person in video["reviews"]: user = person["name"] # 若用户不在字典中,初始化空列表 if user not in summary: summary[user] = [] # 追加当前视频到用户的视频列表 summary[user].append(current_video) return summary
简化版(使用dict.setdefault())
setdefault()方法会检查键是否存在:存在则返回对应值,不存在则设置默认值并返回,可简化代码:
def create_user_summary(video_reviews): summary = {} for video in video_reviews: current_video = video["name"] for person in video["reviews"]: user = person["name"] summary.setdefault(user, []).append(current_video) return summary
运行修正后的代码,即可得到符合期望的汇总字典,完整保留每个用户评论过的所有视频。
内容的提问来源于stack exchange,提问作者Evey Bian
相关产品推荐
相关产品推荐

