如何修改这段Python代码以避免使用lambda函数?
移除lambda函数并保留按制造商排序的解决方案
有两种常用方法可以替换原代码中的lambda函数,同时完全保留原有按制造商名称字母序排序的功能:
方法一:自定义排序键函数
直接在fullInventory方法内定义一个普通函数,用来根据物品键获取对应的制造商名称,将其作为sorted的key参数。
修改后的完整代码:
import csv # 处理csv文件 from datetime import datetime # 后续可用于获取时间 # 初始化报表生成类 class InventoryReports: def __init__(self, item_list): self.item_list = item_list # 传入库存列表用于生成文件 # Part a # 生成FullInventory.csv包含全部库存 # 列顺序:ID、制造商名称、物品类型、价格、保修日期、是否损坏 def fullInventory(self): with open('FullInventory.csv', 'w') as file: items = self.item_list # 自定义函数替代lambda,返回对应键的制造商名称 def get_manufacturer(key): return items[key]['manufacturer'] # 使用自定义函数作为排序依据 keys = sorted(items.keys(), key=get_manufacturer) for item in keys: id = item manufacture = items[item]['manufacturer'] itemType = items[item]['item_type'] price = items[item]['price'] serviceDate = items[item]['service_date'] damaged = items[item]['damaged'] file.write('{},{},{},{},{},{}\n'.format(id, manufacture, itemType, price, serviceDate, damaged))
方法二:使用operator.itemgetter(更简洁)
通过operator模块的itemgetter工具,可以直接指定多层取值路径,避免手写lambda或自定义函数。
修改后的完整代码:
import csv # 处理csv文件 from datetime import datetime # 后续可用于获取时间 from operator import itemgetter # 导入itemgetter工具 # 初始化报表生成类 class InventoryReports: def __init__(self, item_list): self.item_list = item_list # 传入库存列表用于生成文件 # Part a # 生成FullInventory.csv包含全部库存 # 列顺序:ID、制造商名称、物品类型、价格、保修日期、是否损坏 def fullInventory(self): with open('FullInventory.csv', 'w') as file: items = self.item_list # 先对键值对按制造商排序,再提取键列表 # itemgetter(1, 'manufacturer') 表示取每个键值对的第1个元素(物品字典),再取其'manufacturer'值 sorted_items = sorted(items.items(), key=itemgetter(1, 'manufacturer')) keys = [item[0] for item in sorted_items] for item in keys: id = item manufacture = items[item]['manufacturer'] itemType = items[item]['item_type'] price = items[item]['price'] serviceDate = items[item]['service_date'] damaged = items[item]['damaged'] file.write('{},{},{},{},{},{}\n'.format(id, manufacture, itemType, price, serviceDate, damaged))
说明
两种方法都能实现和原lambda函数完全一致的排序逻辑:
- 方法一更直观,适合新手理解;
- 方法二更简洁,是Python中处理此类排序场景的惯用写法。
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

