You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python初学者咨询:列表排序方法及操作正确性确认

扑克牌列表排序的正确方法

Hey there! 作为刚入门Python的小伙伴,遇到排序扑克牌的问题太正常啦~先别担心自己的操作“完全错误”——如果只是直接用了list.sort()或者sorted()没得到预期的扑克牌顺序,这根本不是操作错,只是没考虑到扑克牌有自己特殊的排序规则而已!

先明确你的扑克牌列表格式

首先得清楚你生成的7张牌是什么格式,常见的有两种:

  • 格式1:元组形式,比如[('红桃', '3'), ('黑桃', 'A'), ('方块', 'J')]
  • 格式2:字符串形式,比如['红桃3', '黑桃A', '方块J']

下面针对两种格式分别说具体的排序方法:


情况1:元组格式的扑克牌列表

扑克牌的点数顺序一般是:2 < 3 < ... < 10 < J < Q < K < A,花色的优先级可以自定义(比如常见的黑桃>红桃>方块>梅花)。我们可以先定义两个优先级字典,然后用key参数指定排序规则:

# 定义点数和花色的优先级映射
rank_order = {'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}
suit_order = {'梅花':1, '方块':2, '红桃':3, '黑桃':4} # 可根据自己的需求调整顺序

# 假设你的7张牌列表
cards = [('红桃', '3'), ('黑桃', 'A'), ('方块', 'J'), ('梅花', '10'), ('红桃', 'K'), ('黑桃', '2'), ('方块', 'Q')]

# 排序:先按花色优先级,同花色再按点数从小到大
cards.sort(key=lambda x: (suit_order[x[0]], rank_order[x[1]]))
print(cards)

运行后会得到符合常规扑克牌顺序的结果:

[('梅花', '10'), ('方块', 'J'), ('方块', 'Q'), ('红桃', '3'), ('红桃', 'K'), ('黑桃', '2'), ('黑桃', 'A')]

如果你想先按点数排序、再按花色,只要把key里的顺序调换就行:lambda x: (rank_order[x[1]], suit_order[x[0]])


情况2:字符串格式的扑克牌列表

这种情况需要先把字符串拆成花色和点数,再用同样的优先级规则排序:

rank_order = {'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}
suit_order = {'梅花':1, '方块':2, '红桃':3, '黑桃':4}

# 假设你的7张牌列表
cards = ['红桃3', '黑桃A', '方块J', '梅花10', '红桃K', '黑桃2', '方块Q']

# 定义函数提取排序依据的key
def card_key(card):
    # 处理10的特殊情况(占两个字符)
    if card[-2:] in rank_order:
        suit = card[:-2]
        rank = card[-2:]
    else:
        suit = card[:-1]
        rank = card[-1]
    return (suit_order[suit], rank_order[rank])

# 执行排序
cards.sort(key=card_key)
print(cards)

这段代码会自动拆分字符串里的花色和点数,最终排序结果和元组格式的案例一致。


关于你之前的操作

如果之前你直接用了cards.sort(),得到的可能是按字符串/元组的默认顺序(比如'A'的ASCII码比'2'小,会排在前面),这真的不是“完全错误”——只是Python默认的排序逻辑和扑克牌的规则不匹配而已!只要加上自定义的key参数,就能轻松得到正确的排序结果啦~

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

火山引擎 最新活动