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

Python扑克牌对象数组排序:按牌值及花色+牌值排序

扑克牌游戏排序问题

我正在用Python开发扑克牌游戏,已创建并打乱由Card对象组成的数组,需要实现两种排序:

  • 按指定牌值顺序{2,3,4,5,6,7,8,9,10,J,Q,K,A}排序
  • 按花色+对应牌值(牌值顺序同上)排序

此前使用sort、sorted方法时出现TypeError: 'Card' object is not subscriptable错误,不知如何实现这些排序算法。

尝试过self.cards.sort(key=lambda x: x.value),结果排序顺序为{10,2,3,4,5,6,7,8,9,A,J,Q,K},明白是按字母顺序排序,但疑惑10为何排在首位。

还尝试过values=dict(zip('23456789TQKA',range(2,15))),但同样出现上述错误。

当前代码

Card与Deck类实现

from random import randint

class Card:
    def __init__(self, suit, value):
        self.suit = suit
        self.value = value

    def show(self):
        print("{} - {}".format(self.value, self.suit))

class Deck:
    size = 52
    def __init__(self):
        self.cards = []
        self.build()

    def build(self):
        for s in ["C", "D", "H", "S"]:
            for v in ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"]:
                self.cards.append(Card(s, v))

    def show(self):
        for c in self.cards:
            c.show()

    def shuffle(self):
        for i in range(self.size-1, 0, -1):
            r = randint(0, i + 1)
            self.cards[i], self.cards[r] = self.cards[r], self.cards[i]

测试代码

deck = Deck()
print("After creating The Deck")
deck.show()
deck.shuffle()
print("After Shuffling The Deck: ")
deck.show()
deck.mergeSort()
print("After the merge Sort")
deck.show()

解决方案

1. 定义牌值与花色权重映射

先给每个牌值、花色分配对应权重,确保排序符合需求:

# 牌值权重,对应要求的排序顺序
VALUE_WEIGHTS = {
    "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
}

# 花色权重(可自定义顺序,示例为梅花C<方块D<红桃H<黑桃S)
SUIT_WEIGHTS = {
    "C": 1,
    "D": 2,
    "H": 3,
    "S": 4
}

2. 实现按牌值排序

在Deck类中添加排序方法,通过权重映射实现正确排序:

def sort_by_value(self):
    self.cards.sort(key=lambda card: VALUE_WEIGHTS[card.value])

3. 实现按花色+牌值排序

同样在Deck类中添加方法,用元组作为排序key,先按花色排序,同花色再按牌值排序:

def sort_by_suit_then_value(self):
    self.cards.sort(key=lambda card: (SUIT_WEIGHTS[card.suit], VALUE_WEIGHTS[card.value]))

4. 错误与疑问解析

  • TypeError: 'Card' object is not subscriptable:该错误是因为尝试用下标(如card[0])访问Card对象,但自定义Card类未实现下标访问逻辑,正确做法是直接访问对象属性card.value或card.suit。
  • 10排在首位的原因:字符串排序按字符ASCII码比较,"10"的首字符'1'ASCII码小于'2',因此排在"2"前面;使用权重映射后,"10"对应数值10,就能正确排在9之后。

修改后的测试代码

替换原测试中的deck.mergeSort()为对应排序方法:

deck = Deck()
print("After creating The Deck")
deck.show()
deck.shuffle()
print("\nAfter Shuffling The Deck: ")
deck.show()

print("\nAfter sorting by value: ")
deck.sort_by_value()
deck.show()

print("\nAfter sorting by suit then value: ")
deck.sort_by_suit_then_value()
deck.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:45:47