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

如何获取字典中元组列表的最高值元素 修复卡牌胜负判定函数代码

扑克牌赢牌判断函数实现方案

原代码问题说明

  • 逻辑分支完全倒置:trump参数不为空时反而判断普通花色,为空时才匹配trump花色
  • 首攻花色取值逻辑错误:suit == suit[0]是拿当前牌花色的第一个字符和花色本身比较,完全不符合取首攻花色的需求
  • 语法错误:列表append方法只能传入一个参数,append(rank,suit)会直接抛出参数数量错误
  • 缺少点数权重映射:直接对rank字符串做大小比较不符合牌面规则,比如字符'A'的ASCII码比'K'小,直接用max会得到错误结果
  • max计算时机错误:每添加一张牌就计算一次max,性能冗余且容易出现短列表取值错误

最优实现方案

获取符合条件的元组的最优方法是直接用max()函数的key参数指定比较规则,单次遍历即可得到结果,时间复杂度为O(n),是效率最高的实现方式。
首先定义点数权重映射,确保A为最大点数,优先级从低到高为2<3<...<10<J<Q<K<A:

def winning_card(cards, trump=None):
    # 定义点数权重,值越大点数越高
    rank_weight = {'2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, '10':10, 'J':11, 'Q':12, 'K':13, 'A':14}
    # 第一步:筛选所有王牌,存在则直接取点数最大的王牌
    if trump is not None:
        trump_cards = [card for card in cards if card[1] == trump]
        if trump_cards:
            return max(trump_cards, key=lambda x: rank_weight[x[0]])
    # 第二步:没有王牌则取首攻花色的最大牌
    lead_suit = cards[0][1]
    lead_cards = [card for card in cards if card[1] == lead_suit]
    return max(lead_cards, key=lambda x: rank_weight[x[0]])

逻辑说明

  • 优先判断是否存在王牌:如果指定了trump且存在对应花色的牌,直接在王牌列表里取点数最高的,符合规则1
  • 无王牌时取第一张牌的花色作为首攻花色,筛选所有同花色的牌取点数最高的,符合规则2
  • 用rank_weight字典映射点数权重,保证A为最大点数,符合规则3

内容的提问来源于stack exchange,提问作者J Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:15:01