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

技术问询:基于对象属性排序列表与按重复值排序字典方法

问题解答

1. 基于对象的某个属性对对象列表排序

在Python里处理这种需求超简单,核心就是用内置的sorted()函数或者列表的.sort()方法,通过key参数指定你要用来排序的对象属性就行。

举个具体的例子,假设我们有一个表示游戏的类,每个实例包含游戏名和评分:

class Game:
    def __init__(self, name, rating):
        self.name = name
        self.rating = rating
    
    def __repr__(self):
        return f"Game(name='{self.name}', rating={self.rating})"

# 创建一个对象列表
game_objects = [
    Game("塞尔达传说:王国之泪", 9.8),
    Game("星露谷物语", 9.1),
    Game("艾尔登法环", 9.6),
    Game("空洞骑士", 9.6)
]

如果要按rating属性升序排序,直接给key传一个lambda函数来获取属性值:

# 升序排序(默认规则)
sorted_by_rating = sorted(game_objects, key=lambda obj: obj.rating)
print(sorted_by_rating)
# 输出: [Game(name='星露谷物语', rating=9.1), Game(name='艾尔登法环', rating=9.6), Game(name='空洞骑士', rating=9.6), Game(name='塞尔达传说:王国之泪', rating=9.8)]

# 想要降序的话,加个reverse=True参数就行
sorted_by_rating_desc = sorted(game_objects, key=lambda obj: obj.rating, reverse=True)

要是你想直接修改原列表(而不是生成新列表),就用列表自带的.sort()方法,用法和sorted()几乎一样:

game_objects.sort(key=lambda obj: obj.rating)

只要你的属性是可比较的类型(数字、字符串这些都可以),这种方法都能生效——字符串会按字典序排序哦。

2. 按字典的重复值(评分)排序

我们分两步来实现:先收集用户输入到字典,再完成排序逻辑。

第一步:收集用户输入

先写个循环让用户输入游戏名和评分,直到用户输入空的游戏名就停止:

games = {}
while True:
    game_name = input("请输入游戏名称(输入空值结束输入):").strip()
    if not game_name:
        break
    try:
        game_rating = float(input(f"请输入{game_name}的评分:"))
        games[game_name] = game_rating
    except ValueError:
        print("评分得是数字哦,重新输入试试~")

第二步:按评分排序(支持重复评分)

字典的.items()方法会返回一个由(键, 值)元组组成的可迭代对象,我们用sorted()函数对这个对象排序,把key参数设为取元组的第二个元素(也就是评分)。

Python的排序是稳定排序——也就是说,如果两个元素的排序key(这里是评分)相同,它们会保持在原字典中的相对顺序(Python 3.7及以上版本的字典是插入有序的),完美适配你评分重复的需求。

排序的代码如下:

# 按评分升序排序
sorted_games = sorted(games.items(), key=lambda item: item[1])

# 如果要降序排序,加上reverse=True即可
# sorted_games = sorted(games.items(), key=lambda item: item[1], reverse=True)

# 打印排序后的结果
print("按评分排序后的游戏列表:")
for name, rating in sorted_games:
    print(f"{name}: {rating}")

举个实际的输入例子,如果用户输入后得到的字典是:

games = {"塞尔达传说:王国之泪": 9.8, "星露谷物语": 9.1, "艾尔登法环": 9.6, "空洞骑士": 9.6}

升序排序后的输出会是:

星露谷物语: 9.1
艾尔登法环: 9.6
空洞骑士: 9.6
塞尔达传说:王国之泪: 9.8

注意评分相同的艾尔登法环和空洞骑士保持了输入时的顺序。

如果想在评分相同时,再按游戏名称排序,只需要把key设为一个元组,先按评分,再按名称:

# 先按评分升序,评分相同则按游戏名称字典序升序
sorted_games = sorted(games.items(), key=lambda item: (item[1], item[0]))

这样就能满足更精细的排序需求啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:55:21