Python中如何实现按流派分类存储歌曲信息的字典数据结构
问题解答
存储方案评估
你选择的「字典作顶层结构、流派为键,值为存储对应歌曲信息的嵌套列表」方案非常适合当前需求,属于入门场景下的最优方案:
- 按流派分组的结构天然匹配后续按流派查询、统计的需求,字典的O(1)查找效率远高于列表遍历
- 内层用列表存单首歌的歌名和评分,结构灵活,支持后续修改、排序操作
如果想进一步优化,内层也可以用元组存储单首歌曲信息,因为歌名和评分一般不需要修改,元组占用内存更小,使用逻辑和列表完全一致。
代码错误原因
你现在得到平铺列表的问题,出在数据写入字典的环节:你分别把歌名、评分作为两个独立元素append到了流派对应的列表中,正确的做法是先把这两个值打包成一个子列表,再一次性append到流派列表中。另外原有打印逻辑只能输出每个流派的第一首歌,需要补充内层循环遍历所有歌曲。还有注意不要用dict作为变量名,这是Python的内置类型关键字,覆盖后可能引发未知错误。
修正后代码
def main(): filename = input("Please, enter the file name: ") # 用with语句管理文件,不需要手动调用close,异常时也会自动关闭文件 try: with open(filename, mode="r") as file: # 重命名变量避免覆盖内置dict genre_dict = {} for line in file: line = line.strip() # 跳过空行避免报错 if not line: continue parts = line.split(";") genre = parts[0] track = parts[1] rating = int(parts[2]) if genre not in genre_dict: genre_dict[genre] = [] # 打包成子列表一次性写入 genre_dict[genre].append([track, rating]) except OSError: print("Error opening the selected file!") return # 双层循环打印所有歌曲 for genre in genre_dict: print(genre.upper()) # 遍历当前流派下的所有歌曲 for track_info in genre_dict[genre]: track_name, track_rating = track_info print(f"{track_name}, rating: {track_rating}/100") # 流派之间加空行分隔更美观 print() if __name__ == "__main__": main()
扩展功能实现参考
后续需要新增歌曲数据的话,只需要按照下面的逻辑操作即可:
# 示例:新增一首流派为Pop,歌名为As It Was,评分为92的歌曲 new_genre = "Pop" new_track = "As It Was" new_rating = 92 if new_genre not in genre_dict: genre_dict[new_genre] = [] genre_dict[new_genre].append([new_track, new_rating])
内容的提问来源于stack exchange,提问作者lute
相关产品推荐
相关产品推荐

