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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 03:22:33