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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:05:10