自定义类和排序()的问题

2024-03-28 09:47:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我做了一个自定义类作为练习,一副牌。我有一个可以用random.shuffle()函数洗牌的函数,但是我似乎无法让sort()工作,我知道我可以重建牌组,但是如果我在排序之前从牌组中移除牌,那就行不通了。sort()sorted()需要的不仅仅是定义的__lt__?你知道吗

import random

class Card:
    """ Represents a card using a suit and a rank
    suits are Clubs, Diamonds, Hearts, Spades represented by 0, 1, 2, 3
    the ranks are 1 to 13 for Ace, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, Jack, Queen, King"""

    def __init__(self, rank=2, suit=1):
        self.rank = rank
        self.suit = suit

    suit_names = ['Clubs', 'Diamonds', 'Hearts', 'Spades']
    rank_names = [None, 'Ace', '1', '2', '3', '4', '5', '6',
                 '7', '8', '9', '10', 'Jack', 'Queen', 'King']

    def __str__(self):
        return '%s of %s' %(Card.rank_names[self.rank], 
                            Card.suit_names[self.suit])

    def __lt__(self, other):
        return self.suit, self.rank < other.suit, other.rank

class Deck:
    """ Representing a deck of cards, containing one of each card """

    def __init__(self):
        self.new_deck()

    def new_deck(self):
        self.cards = []
        for suit in range(4):
            for rank in range(1, 14):
                card = Card(rank, suit)
                self.cards.append(card)

    def __str__(self):
        res = []
        for card in self.cards:
            res.append(str(card))
        return '\n'.join(res)

    def pop_card(self):
        return self.cards.pop()

    def add_card(self, card):
        self.cards.append(card)

    def shuffle(self):
        random.shuffle(self.cards)

    def sort(self):
        self.cards.sort()


deck = Deck()
deck.shuffle()
deck.sort()
print(deck)

Python将打印一个随机的deck.sort()就是不工作


Tags: selfforreturnnamesdefrandomcardsort
1条回答
网友
1楼 · 发布于 2024-03-28 09:47:16

您的__lt__方法没有返回bool,请尝试以下操作:

def __lt__(self, other):
    return (self.suit, self.rank) < (other.suit, other.rank)

tuple中元素的顺序可能会被交换,如果这没有给出您想要的顺序:

def __lt__(self, other):
    return (self.rank, self.suit) < (other.rank, other.suit)

相关问题 更多 >