在Python中,有没有一种方法可以对通过由字符串和整数组成的类创建的对象进行排序?

在Python中,有没有一种方法可以对通过由字符串和整数组成的类创建的对象进行排序?,python,class,sorting,Python,Class,Sorting,我有一个任务,通过使用一个类来创建一副牌,该类的方法包括处理、洗牌、扇形、排序和检查牌组是否有序,但我在创建最后一副牌时遇到了问题。牌组必须按每件西装的价值排序,西装的顺序是梅花、钻石、红心,然后是黑桃。到目前为止,我的代码如下所示: import random class Card(): def __init__(self, value, suit): self.value = value self.suit = suit def sho

我有一个任务,通过使用一个类来创建一副牌,该类的方法包括处理、洗牌、扇形、排序和检查牌组是否有序,但我在创建最后一副牌时遇到了问题。牌组必须按每件西装的价值排序,西装的顺序是梅花、钻石、红心,然后是黑桃。到目前为止,我的代码如下所示:

import random

class Card():

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


    def show_card(self):
        print(str(self.value)+ " of " + str(self.suit))


class Deck():

    deck_of_cards = []
    cards_in_play = [] 
    draw_card = None

    def __init__(self):
        self.make_deck()      


    def make_deck(self):
        for suit in ['Clubs', 'Diamonds', 'Hearts', 'Spades']:
            for value in [2, 3, 4, 5, 6, 7, 8, 9, 10, 'Jack', 'Queen', 'King', 'Ace']:
                self.deck_of_cards.append(Card(value,suit))
                self.cards_in_play.append(Card(value, suit))

    def shuffle(self):
        self.shuffled_deck = random.shuffle(self.cards_in_play)


    def fan(self):
        for card in self.cards_in_play:
            card.show_card()

    def deal(self):
        draw_card=self.cards_in_play.pop()
        draw_card.show_card()

    def order(self):
        for suit in ['Club', 'Diamonds', 'Hearts', 'Spades']:
            for value in [2, 3, 4, 5, 6, 7, 8, 9, 10, 'Jack', 'Queen', 'King', 'Ace']:
                self.deck_of_cards.append(Card(value, suit))
                self.cards_in_play.append(Card(value, suit))

处理这一问题的标准方法是认识到这张牌有两个标识:其播放值和显示值。您需要一个与
\uuu repr\uu
函数的简单同源词

非常简单,value
value
带有一个简单的秩整数,
card\u-rank
,0-12。显示值,即用户在任何时候引用它时打印的内容,通过一个简单的翻译列表进行处理:

print_value = (
    '2', '3', '4', '5', '6', '7', '8', '9', '10',
    'Jack', 'Queen', 'King', 'Ace'
)
每当需要输出值时,只需使用
打印值[card\u rank]
。将其放入
类的
函数中


有了这种功能分区,按
卡排名排序
就可以解决您的问题,无需再费事了。

在继续之前,请先修复一些代码:

  • 通用化
    套装
    列表,以便所有类都可以使用它(如果需要)
  • \uuuu init\uu
    函数中移动
    牌组和
    游戏中的
    牌组。如果您不这样做,这将被称为a,并且如果没有初始化(可能是您不想要的东西),它将使每个类都具有该值
  • 类测试:
    a=10
    t1=测试
    t2=试验
    t1.a=11
    打印(t2.a)#>>>11
    
  • random.shuffle()
    是一个就地运行的函数。换句话说,它返回
    None
    ,但修改给定给它的列表
  • 随机导入
    l=[“a”、“b”、“c”]
    打印(随机。随机(l))#>>>无
    打印(l)#>>[b、c、a]
    
  • 不要打印东西--退回它们。它将使您的代码不仅更清晰,而且更有用。如果要打印函数返回的内容,只需打印返回即可
    def交易(自身):
    draw_card=self.cards_in_play.pop()
    回扣卡
    
  • 熟悉
    排序
    \uu lt\uuu
    (详情如下)

  • 随机导入
    套装=[“梅花”、“钻石”、“红心”、“黑桃”]
    值=[2,3,4,5,6,7,8,9,10,'Jack'、'Queen'、'King'、'Ace']
    班级卡:
    定义初始(自我、价值、适合):
    西服
    自我价值=价值
    定义(自身、其他):
    如果suits.index(self.suit)>suits.index(other.suit):
    返回错误
    如果values.index(self.value)>values.index(other.value):
    返回错误
    返回真值
    定义报告(自我):
    返回{self.suit}的{self.value}
    舱面:
    定义初始化(自):
    self.deck_of_cards=[]
    self.cards_in_play=[]
    self.make_deck()
    def make_甲板(自身):
    对于套装:
    对于值中的值:
    自我。卡片组。附加(卡片(价值,套装))
    self.cards\u in\u play.append(卡(值,套装))
    def随机播放(自):
    随机。洗牌(自我。牌在游戏中)
    def风扇(自):
    对于self.cards\u in\u play中的卡:
    打印(卡片)
    def交易(自我):
    draw_card=self.cards_in_play.pop()
    回扣卡
    def订单(自我):
    self.cards\u in\u play.sort()
    定义报告(自我):
    返回报告(游戏中的自卡)
    
    利用magic方法(小于),我们可以使用函数
    sort
    自动对
    类进行排序。为了让这一点更清楚,请注意以下几点:

    #您的新“订单”功能。
    def订单(自我):
    self.cards\u in\u play.sort()
    #实现_ult _uu现在允许我们进行以下比较(这是排序将用于对卡对象列表进行排序的方式):
    打印(卡片(“俱乐部”,2)>卡片(“俱乐部”,3))#正确
    #如果您在文档中注意到,uuu ge_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。
    
    请注意,我还向
    Deck
    Card
    添加了该函数,以便您可以更简单地执行以下操作:

    card=卡(“俱乐部”,2)
    打印(卡片)#>>>2个俱乐部
    

    编辑:@下面的讨论

    suites=['Clubs'、'Diamonds'、'Hearts'、'Spades']
    值=[2,3,4,5,6,7,8,9,10,'Jack'、'Queen'、'King'、'Ace']
    班级卡:
    定义初始(自我、价值、适合):
    西服
    自我价值=价值
    定义(自身、其他):
    如果suits.index(self.suit)>suits.index(other.suit):
    返回错误
    如果values.index(self.value)>values.index(other.value):
    返回错误
    返回真值
    定义(自身、其他):
    如果self.suit==other.suit和self.value==other.value:
    返回真值
    其他:
    返回错误
    定义报告(自我):
    返回{self.suit}的{self.value}
    
    使用新的
    \uuuu eq\uuu
    方法,我们可以在类之间使用
    =
    符号

    c1=卡(2,“俱乐部”)
    c2=卡片(2,“钻石”)
    c3=卡片(2,“钻石”)
    打印(c1==c2)#错误
    打印(c1>c2)#错误
    打印(c1

    这使我们能够轻松地比较
    s

    您可以按如下方式初始化卡类:

    values = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'Jack', 'Queen', 'King', 'Ace']
    suits = ['Clubs', 'Diamonds', 'Hearts', 'Spades']
    
    class Card:
        def __init__(self, value, suit):
            self.suit = suit
            self.value = value
            #if value order matters in first place
            self.rank = 4*values.index(self.value) + suits.index(self.suit)
            #else
            self.rank = 13*suits.index(self.suit) + values.index(self.value)
    
    class Deck:
        def check(self):
            rank_before = self.cards_in_play[0].rank
            for card in self.cards_in_play[1:]:
                rank = card.rank
                if rank > rank_before:
                    rank_before = rank
                else:
                    return False
            return True
    
    并创建检查功能,如下所示:

    values = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'Jack', 'Queen', 'King', 'Ace']
    suits = ['Clubs', 'Diamonds', 'Hearts', 'Spades']
    
    class Card:
        def __init__(self, value, suit):
            self.suit = suit
            self.value = value
            #if value order matters in first place
            self.rank = 4*values.index(self.value) + suits.index(self.suit)
            #else
            self.rank = 13*suits.index(self.suit) + values.index(self.value)
    
    class Deck:
        def check(self):
            rank_before = self.cards_in_play[0].rank
            for card in self.cards_in_play[1:]:
                rank = card.rank
                if rank > rank_before:
                    rank_before = rank
                else:
                    return False
            return True
    

    查看buildin
    排序的
    函数及其
    参数管理。。。即使是我,已经用Python编程很长时间了,也不明白你的意思。您是否建议通过列表对卡片进行排序?我很困惑…@Felipe:你按卡片等级排序,从0到12。“2”到“Ace”的值只是显示值。谢谢你Felipe,这很有帮助,也谢谢你列出了我需要的一些东西