技术问询:基于对象属性排序列表与按重复值排序字典方法
问题解答
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
相关产品推荐
相关产品推荐

