如何基于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
相关产品推荐
相关产品推荐

