如何用Python对象自动按商品类别分组排序数据?
问题描述
现有如下Item对象实例输出:
Item(Shoes, 79, 1, 'Smith') Item(Shoes, 65, 1, 'Smith') Item(T-Shirt, 19, 2, 'Smith')
对应的Python类代码(存在少量拼写错误)如下:
class Item: all = [] # 原代码漏写类定义,且all需作为类属性 def __init__(self, item: str, price: int, quantity: int, buyer: str): # 赋值给实例属性 self.item = item self.price = price # 原代码拼写错误:prive -> price self.quantity = quantity self.buyer = buyer # 将实例添加到类列表 Item.all.append(self) @classmethod def instantiate_from_csv(cls): import pandas as pd # 建议将导入放在文件顶部 df = pd.read_csv('items.csv', sep=';', usecols=["item", "price", "quantity", "buyer"]) for index, item_row in df.iterrows(): cls( item=str(item_row.get('item')), price=int(item_row.get('price')), quantity=int(item_row.get('quantity')), buyer=str(item_row.get('buyer')), ) def __repr__(self): return f"\nItem('{self.item}', {self.price}, {self.quantity}, '{self.buyer}')"
数据从CSV文件读取,希望按如下格式自动识别唯一类别并分组输出:
Shoes: -Smith, 1, 79$ -Smith, 1, 65$ T-Shirt: -Smith, 2, 19$
利用Python对象能否实现该需求?
可以实现,具体方案如下
核心思路是对Item.all中的实例按item属性分组,再遍历分组结果格式化输出,以下是两种可行实现方式:
方式一:在Item类中添加类方法实现分组输出
补全并修正原类代码,新增分组输出的类方法:
class Item: all = [] def __init__(self, item: str, price: int, quantity: int, buyer: str): self.item = item self.price = price self.quantity = quantity self.buyer = buyer Item.all.append(self) @classmethod def instantiate_from_csv(cls): import pandas as pd df = pd.read_csv('items.csv', sep=';', usecols=["item", "price", "quantity", "buyer"]) for index, item_row in df.iterrows(): cls( item=str(item_row.get('item')), price=int(item_row.get('price')), quantity=int(item_row.get('quantity')), buyer=str(item_row.get('buyer')), ) @classmethod def print_grouped_items(cls): # 用字典按物品类别分组 grouped = {} for instance in cls.all: if instance.item not in grouped: grouped[instance.item] = [] grouped[instance.item].append(instance) # 按要求格式输出 for category, instances in grouped.items(): print(f"{category}:") for inst in instances: print(f"-{inst.buyer}, {inst.quantity}, {inst.price}$") print() # 类别间空行 def __repr__(self): return f"\nItem('{self.item}', {self.price}, {self.quantity}, '{self.buyer}')"
使用时只需调用Item.instantiate_from_csv()加载数据,再执行Item.print_grouped_items()即可得到目标输出。
方式二:外部代码实现分组输出
若不想修改原Item类,可在外部完成分组和输出:
# 先加载CSV数据 Item.instantiate_from_csv() # 按item属性分组 grouped_items = {} for obj in Item.all: category = obj.item if category not in grouped_items: grouped_items[category] = [] grouped_items[category].append(obj) # 格式化输出 for cat, items in grouped_items.items(): print(f"{cat}:") for item_obj in items: print(f"-{item_obj.buyer}, {item_obj.quantity}, {item_obj.price}$") print()
内容的提问来源于stack exchange,提问作者Shesch
相关产品推荐
相关产品推荐

