You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:54:04