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
相关产品推荐
相关产品推荐

