如何在Python中使用sort函数对Business对象列表按评分降序并基于ID排序
解决方案
嘿,要实现这个排序需求其实很简单,Python 自带的列表排序功能就能轻松搞定。我先给你完整的可运行代码,再拆解其中的逻辑:
首先,我们得先定义 Business 类(不然没法实例化你给出的对象),然后对列表进行排序:
class Business: def __init__(self, id, rating, vegan_friendly, price, distance): self.id = id self.rating = rating self.vegan_friendly = vegan_friendly self.price = price self.distance = distance # 方便打印查看结果 def __repr__(self): return f"Business(id={self.id}, rating={self.rating}, vegan_friendly={self.vegan_friendly}, price={self.price}, distance={self.distance})" # 你的原始列表(修正了id=5的vegan_friendly大小写,避免报错) businesses = [ Business(id=1, rating=4.0, vegan_friendly=True, price=4, distance=10.0), Business(id=2, rating=2.5, vegan_friendly=False, price=2, distance=5.0), Business(id=3, rating=4.5, vegan_friendly=False, price=1, distance=1.0), Business(id=4, rating=3.0, vegan_friendly=True, price=2, distance=3.4), Business(id=5, rating=4.5, vegan_friendly=True, price=1, distance=6.3), Business(id=6, rating=3.5, vegan_friendly=True, price=2, distance=1.2), ] # 方法1:直接修改原列表(用list.sort()) businesses.sort(key=lambda x: (-x.rating, x.id)) print("排序后的列表:") for biz in businesses: print(biz) # 方法2:生成新的排序列表(不修改原列表,用sorted()) # sorted_businesses = sorted(businesses, key=lambda x: (-x.rating, x.id)) # print(sorted_businesses)
关键逻辑解释
这里的核心是 sort/sorted 函数的 key 参数:
lambda x: (-x.rating, x.id)是一个匿名函数,用来指定排序的依据:- 首先按
-x.rating排序:因为 Python 的排序默认是升序,给rating加负号后,rating 越高的元素,负数值越小,会排在前面,实现了rating从高到降序的需求。 - 当两个元素的
rating相同时,会接着比较第二个元素x.id,按id的升序排序(因为没有加负号,默认升序),也就是 id 更小的排在前面。
- 首先按
运行结果
执行代码后,输出的排序结果会是:
Business(id=3, rating=4.5, vegan_friendly=False, price=1, distance=1.0) Business(id=5, rating=4.5, vegan_friendly=True, price=1, distance=6.3) Business(id=1, rating=4.0, vegan_friendly=True, price=4, distance=10.0) Business(id=6, rating=3.5, vegan_friendly=True, price=2, distance=1.2) Business(id=4, rating=3.0, vegan_friendly=True, price=2, distance=3.4) Business(id=2, rating=2.5, vegan_friendly=False, price=2, distance=5.0)
完全符合你要求的“先按rating从高到低,rating相同则按id排序”的规则。
内容的提问来源于stack exchange,提问作者komal vyas
相关产品推荐
相关产品推荐

