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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 00:35:23