Python按对象属性及字典值排序:单一行代码修正需求
修正Dwarf对象列表的排序逻辑
问题描述
现有Python代码中,dwarfs.sort(key=lambda x:-x.physics)仅实现了按physics属性降序排序,但实际需求是:
- 优先按
physics属性降序排序 - 若
physics值相同,则按颜色在colors字典中的排序顺序(即颜色对应矮人数量降序的顺序)排序
当前输出不符合期望,仅需修改排序的key参数即可解决问题。
解决方法
将原排序代码行:
dwarfs.sort(key=lambda x:-x.physics)
替换为:
dwarfs.sort(key=lambda x: (-x.physics, list(colors.keys()).index(x.hat_color)))
原理说明
-x.physics保证按物理值降序排列,满足第一排序条件list(colors.keys()).index(x.hat_color)利用已排序的colors字典(已按颜色对应矮人数量降序完成排序),通过颜色在键列表中的索引确定优先级:索引越小的颜色排序越靠前,实现同物理值下按指定颜色顺序排序的需求
修改后的完整代码
class Dwarf: def __init__(self,name,hat_color,physics:int): self.name=name self.hat_color=hat_color self.physics=physics def __repr__(self): return f"({self.hat_color}) {self.name} <-> {self.physics}" dwarfs=[] colors={} while True: entry=input() if entry=="Once upon a time": break name,hat_color,physics=entry.split(" <:> ") physics=int(physics) obj=Dwarf(name,hat_color,physics) tracker=None if len(dwarfs)==0: dwarfs.append(obj) else: for i in dwarfs: if name==i.name and hat_color==i.hat_color: tracker=i break if tracker!= None: dwarfs.remove(tracker) dwarfs.append(obj) if hat_color not in colors: colors[hat_color]=1 else: if tracker is None: colors[hat_color]+=1 colors={k:v for k,v in sorted(colors.items(),key=lambda x:-x[1])} dwarfs.sort(key=lambda x: (-x.physics, list(colors.keys()).index(x.hat_color))) for dwarf in dwarfs: print(dwarf)
验证结果
输入示例:
Grumpy <:> Red <:> 5000 Grumpy <:> Blue <:> 10000 Grumpy <:> Red <:> 10000 Happy <:> Blue <:> 10000 Once upon a time
修改后输出:
(Blue) Grumpy <-> 10000 (Blue) Happy <-> 10000 (Red) Grumpy <-> 10000
与期望输出完全一致。
内容的提问来源于stack exchange,提问作者ddoch003
相关产品推荐
相关产品推荐

