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

如何基于Pool实例的length属性对列表中的类实例进行排序?

如何基于Pool的length属性对列表中的类实例进行排序?

问题描述

需要实现PoolSet类的sort方法,将字典内每个列表中的Pool实例按照length属性排序。示例如下:

排序前(对应Pool实例属性):

{"Metal":[['A', 20, 50, 'Wide']], "Wood":[['B', 50, 20, 'Thin'], ['C', 30, 30, 'Wide']]}

排序后:

{"Metal":[['A', 20, 50, 'Wide']], "Wood":[['C', 30, 30, 'Wide'], ['B', 50, 20, 'Thin']]}

当前代码框架存在一些语法和逻辑问题(已标注修复点):

class PoolSet:
    def __init__ (self, ownerId, owner):  # 修复:添加缺失的冒号
        self._ownerId = ownerId  # 修复:原代码错误赋值为owner,改为ownerId
        self._pools = {"Metal":[],"Wood":[]}

    # 示例:将Pool对象添加到对应字典键的列表中(建议封装为方法,避免直接操作属性)
    def add_pool(self, material, label, length, width, grip):
        self._pools[material].append(Pool(label, length, width, grip))

    def sort(self):
       ????

class Pool:
    def __init__(self, label, length, width, grip):
        # 修复:初始化实例属性,否则@property会抛出AttributeError
        self._label = label
        self._length = length
        self._width = width
        self._grip = grip

    @property
    def label(self):
        return self._label

    @property
    def length(self):
        return self._length

解决方案

要实现按Pool的length属性排序,只需在sort方法中遍历字典的每个列表,使用排序方法指定依据为length属性即可。

原地排序(使用列表.sort()方法)

这种方法直接修改原列表,无需创建新列表,效率更高:

def sort(self):
    # 遍历字典中所有材料对应的Pool列表
    for pool_list in self._pools.values():
        # 按length属性升序排序,reverse=True可切换为降序
        pool_list.sort(key=lambda pool: pool.length)

生成新列表排序(使用sorted()函数)

这种方法返回排序后的新列表,替换原列表:

def sort(self):
    for material in self._pools:
        self._pools[material] = sorted(self._pools[material], key=lambda pool: pool.length)

关键说明

  • key=lambda pool: pool.length:指定排序的依据是每个Pool实例的length属性值。
  • 如果需要降序排序,只需添加reverse=True参数,例如:
    pool_list.sort(key=lambda pool: pool.length, reverse=True)
    

完整可运行代码

class PoolSet:
    def __init__ (self, ownerId, owner):
        self._ownerId = ownerId
        self._owner = owner
        self._pools = {"Metal":[],"Wood":[]}

    def add_pool(self, material, label, length, width, grip):
        # 校验材料类型是否合法
        if material in self._pools:
            self._pools[material].append(Pool(label, length, width, grip))

    def sort(self):
        # 按length升序排序每个材料下的Pool列表
        for pool_list in self._pools.values():
            pool_list.sort(key=lambda p: p.length)

class Pool:
    def __init__(self, label, length, width, grip):
        self._label = label
        self._length = length
        self._width = width
        self._grip = grip

    @property
    def label(self):
        return self._label

    @property
    def length(self):
        return self._length

# 测试代码
if __name__ == "__main__":
    pool_set = PoolSet("owner_001", "Test Owner")
    pool_set.add_pool("Metal", "A", 20, 50, "Wide")
    pool_set.add_pool("Wood", "B", 50, 20, "Thin")
    pool_set.add_pool("Wood", "C", 30, 30, "Wide")
    
    print("排序前:")
    for material, pools in pool_set._pools.items():
        print(f"{material}: {[(p.label, p.length, p._width, p._grip) for p in pools]}")
    
    pool_set.sort()
    
    print("\n排序后:")
    for material, pools in pool_set._pools.items():
        print(f"{material}: {[(p.label, p.length, p._width, p._grip) for p in pools]}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:30:54