如何按主属性value、次属性suit对卡牌类对象列表排序?
按主属性value、次属性suit排序卡牌列表的实现方案
嘿,这个卡牌排序的需求很常见,我来给你几个实用的实现方案!
首先假设我们的卡牌类定义如下(方便后续示例演示):
class Card: def __init__(self, value, suit): self.value = value # 比如14代表A,2-13对应数字牌和花牌 self.suit = suit # 比如'Spades'(黑桃)、'Hearts'(红桃)等 def __repr__(self): return f"Card(value={self.value}, suit='{self.suit}')"
方法一:使用sort()的key参数(最简洁灵活)
Python的列表sort()方法支持通过key参数指定排序依据,我们可以返回一个元组,元组的第一个元素是主排序属性,第二个是次排序属性。因为你需要value=14的卡牌排在最前面,所以对value做降序处理,对suit做升序(或自定义顺序)处理:
# 示例卡牌列表 cards = [ Card(10, 'Hearts'), Card(14, 'Spades'), Card(14, 'Clubs'), Card(5, 'Diamonds') ] # 先按value降序(14优先),再按suit升序排序 cards.sort(key=lambda card: (-card.value, card.suit)) # 排序结果:[Card(value=14, suit='Clubs'), Card(value=14, suit='Spades'), Card(value=10, suit='Hearts'), Card(value=5, suit='Diamonds')]
自定义suit顺序
如果你的卡牌suit需要按特定规则排序(比如黑桃>红桃>方块>梅花),可以给suit映射一个权重值,再用这个权重作为次排序依据:
# 自定义suit权重:数字越大优先级越高 suit_priority = {'Spades': 3, 'Hearts': 2, 'Diamonds': 1, 'Clubs': 0} cards.sort(key=lambda card: (-card.value, suit_priority[card.suit])) # 此时value=14的卡牌会按Spades→Hearts→Diamonds→Clubs的顺序排列
方法二:给Card类定义比较方法(让类本身支持排序)
如果你希望Card对象可以直接被比较排序,可以在类中实现__lt__(小于)魔法方法,这样调用sort()时无需额外传参:
class Card: def __init__(self, value, suit): self.value = value self.suit = suit def __repr__(self): return f"Card(value={self.value}, suit='{self.suit}')" def __lt__(self, other): # 先比较value:如果当前卡牌value更小,返回True(即排在前面) if self.value != other.value: return self.value < other.value # value相同时,比较suit:suit字典序小的排在前面 return self.suit < other.suit # 因为__lt__定义的是"小于"逻辑,默认sort是升序(value小的在前),所以需要加reverse=True让value大的在前 cards.sort(reverse=True)
这种方式适合需要频繁对Card对象排序的场景,一次定义后可以直接调用排序方法。
内容的提问来源于stack exchange,提问作者dan479
相关产品推荐
相关产品推荐

