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

如何对CSV读取的字典列表去重合并年份,生成书籍类实例?

字典列表去重合并年份并生成类实例解决方案

问题描述

有一个从CSV读取的字典列表,示例如下:

[{"Name": "aa", "Year": "2022"}, {"Name": "aa", "Year": "2021"}, {"Name": "bb", "Year": "2016"}, {"Name": "cc", "Year": "2015"}]

需要移除名称重复的条目,将同一名称对应的年份合并为列表,处理后结果应为:

[{"Name": "aa", "Year": ["2022", "2021"]}, {"Name": "bb", "Year": ["2016"]}, {"Name": "cc", "Year": ["2015"]}]

最终要根据Genre字段创建FictionBook或NonFictionBook类的实例,但现有代码的去重合并逻辑存在问题。

原代码问题分析

  1. seen_books和years_list在循环内部每次都会重新初始化,无法跨迭代记录已处理的书籍和对应年份。
  2. 循环变量使用list_of_books,但实际读取CSV得到的是book_list,变量名不匹配会直接报错。
  3. 最后打印时使用bestseller(单数),但实际存储实例的列表是bestsellers(复数),导致运行异常。
  4. Genre判断逻辑完全颠倒:当Genre为Non Fiction时创建FictionBook实例,不符合业务逻辑。
  5. 未对同名称的书籍做聚合处理,直接遍历每个条目创建实例,会生成大量重复的同书名实例。

修正后的代码

import csv

def read_csv_file(self, path):
    book_list = []
    with open(path) as f:
        read_dict = csv.DictReader(f)
        for row in read_dict:
            book_list.append(row)

    # 用字典按书名分组,聚合年份和其他公共字段
    grouped_books = {}
    for book in book_list:
        name = book["Name"]
        if name not in grouped_books:
            # 首次遇到该书名,初始化基础信息和年份列表
            grouped_books[name] = {
                "Author": book["Author"],
                "User Rating": float(book["User Rating"]),
                "Reviews": int(book["Reviews"]),
                "Price": float(book["Price"]),
                "Genre": book["Genre"],
                "Years": [book["Year"]]
            }
        else:
            # 已存在的书名,仅追加年份到列表
            grouped_books[name]["Years"].append(book["Year"])

    bestsellers = []
    for name, book_data in grouped_books.items():
        genre = book_data["Genre"]
        # 根据Genre创建对应类实例,修正原逻辑的颠倒问题
        if genre == "Fiction":
            instance = FictionBook(
                name,
                book_data["Author"],
                book_data["User Rating"],
                book_data["Reviews"],
                book_data["Price"],
                book_data["Years"],
                genre
            )
        else:
            instance = NonFictionBook(
                name,
                book_data["Author"],
                book_data["User Rating"],
                book_data["Reviews"],
                book_data["Price"],
                book_data["Years"],
                genre
            )
        bestsellers.append(instance)

    # 打印每个实例的title(假设类中title属性对应Name字段)
    for book in bestsellers:
        print(book.title)

代码说明

  • 使用字典grouped_books按书名作为唯一键,确保每个书名只被处理一次,自动完成去重。
  • 首次遇到书名时初始化所有公共字段,后续同名条目仅追加年份,避免重复存储冗余信息。
  • 修正了Genre与类的对应逻辑:Fiction对应FictionBook,Non Fiction对应NonFictionBook。
  • 统一变量命名,避免拼写错误导致的运行异常。

内容的提问来源于stack exchange,提问作者Lijpe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:25:26