Python实现麻将手牌自动排序:如何比较当前元组与前一个元组来插入正确位置?
Python实现麻将手牌自动排序:如何比较当前元组与前一个元组来插入正确位置?
嘿,我来帮你搞定这个问题!首先咱们先解决你遇到的语法错误,然后再说说更简单靠谱的手牌排序方法~
先看你的语法错误原因
你写的这行代码:
if ((number+(suit*9)(myHand[i-1]))<number+(suit*9):
有两个明显问题:
- 括号不匹配:条件判断的括号没闭合,导致语法报错
- 逻辑写法错误:你想拿前一张牌的
number + suit*9做比较,但没正确解包myHand[i-1]这个元组,直接把元组当函数调用的写法完全不对
就算你修复了括号,这个逻辑本身也有问题——你只和前一张牌比较就直接插在第1位,根本不是正确的插入排序逻辑,会导致手牌排序混乱(比如当前牌比前一张小,但比更前面的牌大,插在第1位就错了)。
更简单高效的解决方案:直接对整个手牌排序
其实完全不用写复杂的插入判断,麻将的排序逻辑非常清晰:先按花色分组,同花色内按数字从小到大排序,咱们直接用Python的sorted()函数就能搞定,代码简洁还不容易出错。
你的myHand是元组列表,每个元组结构是(tile, number, suit),排序时指定key为(花色, 数字),就能自动把同花色的牌归为一组,同花色内按数字顺序排列,完美符合麻将手牌的使用习惯。
优化后的完整代码片段
把你原来的“make readable UI version”部分替换成下面的内容,同时可以删掉那些没用的var0~var33变量:
# 对我的手牌进行排序:先按花色分组,同花色内按数字排序 myHand_sorted = sorted(myHand, key=lambda card: (card[2], card[1])) # 转换为可读的可视化手牌 visibleHand = [] for tile, number, suit in myHand_sorted: # 用字典映射替换数字和花色名称 display_number = numbers.get(number, number) display_suit = suits.get(suit, suit) visibleHand.append(f"{display_number} {display_suit}") print(visibleHand)
为什么这个方法更好?
- 代码更简洁:一行
sorted()就搞定排序,不用写复杂的插入判断 - 排序更准确:确保整个手牌完全按花色+数字有序,不会出现局部混乱
- 易维护:如果以后要调整排序规则(比如改变花色优先级),只需要修改排序key就行
修复你原来的插入式排序(不推荐,仅作参考)
如果你坚持想用逐个插入的方式,正确的写法应该是这样(但真的没必要这么麻烦):
visibleHand = [] # 先把所有手牌转成带排序值的元组,方便比较 hand_with_rank = [] for tile, number, suit in myHand: rank = suit * 9 + number display_str = f"{numbers.get(number, number)} {suits.get(suit, suit)}" hand_with_rank.append( (rank, display_str) ) # 插入排序逻辑 for rank, card_str in hand_with_rank: inserted = False for idx in range(len(visibleHand)): # 取出已插入牌的排序值 existing_rank, _ = hand_with_rank[idx] if rank < existing_rank: visibleHand.insert(idx, card_str) inserted = True break if not inserted: visibleHand.append(card_str) print(visibleHand)
这种方式需要额外维护排序值,代码冗余且容易出错,还是推荐用直接排序的方法。
备注:内容来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

