如何在Python中实现黑胶唱片库的多维度分类筛选功能?
黑胶唱片收藏管理程序:筛选逻辑实现方案
我正在开发一款管理个人黑胶唱片收藏的程序,程序需要提示用户输入艺人名称(Artist name)、专辑(Album)、流派(Genre)、唱片尺寸(record size)等信息,希望能快速筛选出特定流派(如布鲁斯)、特定尺寸(如45)的唱片。目前用字典存储数据,但不知道怎么实现所需的分类筛选逻辑,现有代码如下:
#Record Library ''' The objective of this project is to create a program that will take in information regarding the Records in my collection and then sort them by artist, genre, and record size (45/70/35) ''' ''' I hope to have it save all the data to a text file that can be read as is or gone through in the program. It should allow you to see all records by an artist, in a certain genre, or of a specific size. I would also like to make a favorites group. ''' def welcome(): print("Welcome to the Vinyl Record Library") print("A tool to keep track of all your Vinyls") def homeMenu(): x = 0 while True: try: x = int(input(''' SELECT AN OPTION 1) Add record 2) Delete record 3) View Genre 4) View Artist 5) View Size 6) View Favorites 7) Edit 8) QUIT ''')) except ValueError: print("Please enter a valid option") continue if x >=1 and x <=8: return x else: print("Please enter a valid option") def addRecord(musicDict): print("add") # Not for final product x = input("Please enter the Artist name: ") y = input("Please enter the Album name: " ) tempDict = {x : y} musicDict = musicDict| tempDict return musicDict def removeRecord(musicDict): print("remove") # Not for final product print(musicDict) x = input("Please enter the Artist name you want to remove: ") del musicDict[x] return musicDict def viewGenre(musicDict): print("genre") # Not for final product print(musicDict) return musicDict def viewArtist(musicDict): print("artist") print(musicDict) return musicDict def viewSize(musicDict): print("size") # Not for final product print(musicDict) return musicDict def viewFavorites(musicDict): print("favorites") # Not for final product print(musicDict) return musicDict def editRec(musicDict): print("edit") # Not for final product print(musicDict) return musicDict def quitApp(): exit() def main(): musicDict = {} welcome() x = 0 while x != 8: x = homeMenu() if x == 1: musicDict = addRecord(musicDict) elif x == 2: musicDict = removeRecord(musicDict) elif x == 3: musicDict = viewGenre(musicDict) elif x == 4: musicDict = viewArtist(musicDict) elif x == 5: musicDict = viewSize(musicDict) elif x == 6: musicDict = viewFavorites(musicDict) elif x == 7: musicDict = editRec(musicDict) else: quit main()
核心问题分析
当前的字典结构{艺人: 专辑}仅能存储艺人与专辑的对应关系,丢失了流派、尺寸等关键筛选字段,导致无法实现分类筛选。需要先调整数据存储结构,再实现筛选逻辑。
解决方案步骤
1. 调整数据存储结构
改用列表存储所有唱片,每个唱片是包含完整信息的字典,示例结构:
vinyl_collection = [ { "artist": "Muddy Waters", "album": "Muddy Waters Sings 'Big Bill'", "genre": "Blues", "size": "45", "favorite": False }, # 更多唱片... ]
2. 修改添加唱片函数
收集所有必填字段,将完整的唱片字典加入列表:
def addRecord(vinyl_collection): artist = input("请输入艺人名称: ") album = input("请输入专辑名称: ") genre = input("请输入流派: ") while True: size = input("请输入唱片尺寸(45/70/35): ") if size in ["45", "70", "35"]: break print("请输入有效的尺寸选项: 45/70/35") vinyl_collection.append({ "artist": artist, "album": album, "genre": genre, "size": size, "favorite": False }) print("唱片添加成功!") return vinyl_collection
3. 实现流派筛选功能
遍历唱片列表,匹配目标流派并输出:
def viewGenre(vinyl_collection): if not vinyl_collection: print("收藏库为空") return vinyl_collection target_genre = input("请输入要查看的流派: ").strip().title() matches = [r for r in vinyl_collection if r["genre"].title() == target_genre] if not matches: print(f"未找到流派为「{target_genre}」的唱片") return vinyl_collection print(f"\n流派为「{target_genre}」的唱片:") for idx, r in enumerate(matches, 1): print(f"{idx}. 艺人: {r['artist']}, 专辑: {r['album']}, 尺寸: {r['size']}, 收藏状态: {'已收藏' if r['favorite'] else '未收藏'}") return vinyl_collection
4. 实现尺寸筛选功能
按尺寸字段匹配并输出结果:
def viewSize(vinyl_collection): if not vinyl_collection: print("收藏库为空") return vinyl_collection target_size = input("请输入要查看的唱片尺寸(45/70/35): ").strip() if target_size not in ["45", "70", "35"]: print("请输入有效的尺寸选项: 45/70/35") return vinyl_collection matches = [r for r in vinyl_collection if r["size"] == target_size] if not matches: print(f"未找到尺寸为「{target_size}」的唱片") return vinyl_collection print(f"\n尺寸为「{target_size}」的唱片:") for idx, r in enumerate(matches, 1): print(f"{idx}. 艺人: {r['artist']}, 专辑: {r['album']}, 流派: {r['genre']}, 收藏状态: {'已收藏' if r['favorite'] else '未收藏'}") return vinyl_collection
5. 调整其他配套函数
删除、编辑、查看艺人/收藏列表等功能也需要对应适配新的数据结构,比如删除唱片可以通过艺人+专辑定位:
def removeRecord(vinyl_collection): if not vinyl_collection: print("收藏库为空,无法删除唱片") return vinyl_collection artist = input("请输入要删除唱片的艺人名称: ").strip() album = input("请输入要删除的专辑名称: ").strip() for idx, record in enumerate(vinyl_collection): if record["artist"].strip() == artist and record["album"].strip() == album: del vinyl_collection[idx] print("唱片删除成功!") return vinyl_collection print(f"未找到艺人「{artist}」的专辑「{album}」") return vinyl_collection
修改后的完整代码
# 黑胶唱片收藏库 ''' 项目目标:创建一个程序,录入个人黑胶唱片信息,并按艺人、流派、唱片尺寸(45/70/35)分类 ''' ''' 需求:将数据保存到文本文件,支持查看特定艺人、流派、尺寸的唱片,以及收藏功能 ''' def welcome(): print("欢迎使用黑胶唱片收藏库") print("管理你的黑胶唱片收藏的工具") def homeMenu(): x = 0 while True: try: x = int(input(''' 请选择操作选项 1) 添加唱片 2) 删除唱片 3) 按流派查看 4) 按艺人查看 5) 按尺寸查看 6) 查看收藏列表 7) 编辑唱片信息 8) 退出程序 ''')) except ValueError: print("请输入有效的数字选项") continue if 1 <= x <= 8: return x else: print("请输入1-8之间的有效数字") def addRecord(vinyl_collection): artist = input("请输入艺人名称: ") album = input("请输入专辑名称: ") genre = input("请输入流派: ") while True: size = input("请输入唱片尺寸(45/70/35): ") if size in ["45", "70", "35"]: break print("请输入有效的尺寸选项: 45/70/35") vinyl_collection.append({ "artist": artist, "album": album, "genre": genre, "size": size, "favorite": False }) print("唱片添加成功!") return vinyl_collection def removeRecord(vinyl_collection): if not vinyl_collection: print("收藏库为空,无法删除唱片") return vinyl_collection artist = input("请输入要删除唱片的艺人名称: ").strip() album = input("请输入要删除的专辑名称: ").strip() for idx, record in enumerate(vinyl_collection): if record["artist"].strip() == artist and record["album"].strip() == album: del vinyl_collection[idx] print("唱片删除成功!") return vinyl_collection print(f"未找到艺人「{artist}」的专辑「{album}」") return vinyl_collection def viewGenre(vinyl_collection): if not vinyl_collection: print("收藏库为空") return vinyl_collection target_genre = input("请输入要查看的流派: ").strip().title() matches = [r for r in vinyl_collection if r["genre"].title() == target_genre] if not matches: print(f"未找到流派为「{target_genre}」的唱片") return vinyl_collection print(f"\n流派为「{target_genre}」的唱片:") for idx, r in enumerate(matches, 1): print(f"{idx}. 艺人: {r['artist']}, 专辑: {r['album']}, 尺寸: {r['size']}, 收藏状态: {'已收藏' if r['favorite'] else '未收藏'}") return vinyl_collection def viewArtist(vinyl_collection): if not vinyl_collection: print("收藏库为空") return vinyl_collection target_artist = input("请输入要查看的艺人名称: ").strip().title() matches = [r for r in vinyl_collection if r["artist"].title() == target_artist] if not matches: print(f"未找到艺人「{target_artist}」的唱片") return vinyl_collection print(f"\n艺人「{target_artist}」的唱片:") for idx, r in enumerate(matches, 1): print(f"{idx}. 专辑: {r['album']}, 流派: {r['genre']}, 尺寸: {r['size']}, 收藏状态: {'已收藏' if r['favorite'] else '未收藏'}") return vinyl_collection def viewSize(vinyl_collection): if not vinyl_collection: print("收藏库为空") return vinyl_collection target_size = input("请输入要查看的唱片尺寸(45/70/35): ").strip() if target_size not in ["45", "70", "35"]: print("请输入有效的尺寸选项: 45/70/35") return vinyl_collection matches = [r for r in vinyl_collection if r["size"] == target_size] if not matches: print(f"未找到尺寸为「{target_size}」的唱片") return vinyl_collection print(f"\n尺寸为「{target_size}」的唱片:") for idx, r in enumerate(matches, 1): print(f"{idx}. 艺人: {r['artist']}, 专辑: {r['album']}, 流派: {r['genre']}, 收藏状态: {'已收藏' if r['favorite'] else '未收藏'}") return vinyl_collection def viewFavorites(vinyl_collection): if not vinyl_collection: print("收藏库为空") return vinyl_collection favorites = [r for r in vinyl_collection if r["favorite"]] if not favorites: print("暂无收藏的唱片") return vinyl_collection print("\n收藏的唱片列表:") for idx, r in enumerate(favorites, 1): print(f"{idx}. 艺人: {r['artist']}, 专辑: {r['album']}, 流派: {r['genre']}, 尺寸: {r['size']}") return vinyl_collection def editRec(vinyl_collection): if not vinyl_collection: print("收藏库为空,无法编辑") return vinyl_collection artist = input("请输入要编辑的唱片艺人名称: ").strip() album = input("请输入要编辑的专辑名称: ").strip() for record in vinyl_collection: if record["artist"].strip() == artist and record["album"].strip() == album: print("\n当前唱片信息:") print(f"艺人: {record['artist']}, 专辑: {record['album']}, 流派: {record['genre']}, 尺寸: {record['size']}, 收藏状态: {'已收藏' if record['favorite'] else '未收藏'}") record["artist"] = input(f"输入新的艺人名称(回车保留原内容「{record['artist']}」): ") or record["artist"] record["album"] = input(f"输入新的专辑名称(回车保留原内容「{record['album']}」): ") or record["album"] record["genre"] = input(f"输入新的流派(回车保留原内容「{record['genre']}」): ") or record["genre"] while True: size = input(f"输入新的尺寸(45/70/35,回车保留原内容「{record['size']}」): ") or record["size"] if size in ["45", "70", "35"]: record["size"] = size break print("请输入有效的尺寸选项: 45/70/35") fav_input = input(f"设置收藏状态(Y=已收藏/N=未收藏,回车保留原状态): ").strip().upper() if fav_input == "Y": record["favorite"] = True elif fav_input == "N": record["favorite"] = False print("唱片信息编辑成功!") return vinyl_collection print(f"未找到艺人「{artist}」的专辑「{album}」") return vinyl_collection def quitApp(): print("感谢使用黑胶唱片收藏库,再见!") exit() def main(): vinyl_collection = [] welcome() x = 0 while x != 8: x = homeMenu() if x == 1: vinyl_collection = addRecord(vinyl_collection) elif x == 2: vinyl_collection = removeRecord(vinyl_collection) elif x == 3: vinyl_collection = viewGenre(vinyl_collection) elif x == 4: vinyl_collection = viewArtist(vinyl_collection) elif x == 5: vinyl_collection = viewSize(vinyl_collection) elif x == 6: vinyl_collection = viewFavorites(vinyl_collection) elif x == 7: vinyl_collection = editRec(vinyl_collection) else: quitApp() main()
内容的提问来源于stack exchange,提问作者AtomStalker
相关产品推荐
相关产品推荐

