如何对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类的实例,但现有代码的去重合并逻辑存在问题。
原代码问题分析
seen_books和years_list在循环内部每次都会重新初始化,无法跨迭代记录已处理的书籍和对应年份。- 循环变量使用
list_of_books,但实际读取CSV得到的是book_list,变量名不匹配会直接报错。 - 最后打印时使用
bestseller(单数),但实际存储实例的列表是bestsellers(复数),导致运行异常。 - Genre判断逻辑完全颠倒:当
Genre为Non Fiction时创建FictionBook实例,不符合业务逻辑。 - 未对同名称的书籍做聚合处理,直接遍历每个条目创建实例,会生成大量重复的同书名实例。
修正后的代码
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
相关产品推荐
相关产品推荐

