首页 > 解决方案 > 检查以特定字符串开头的列表

问题描述

我正在创建这个名为 isordered 的方法,它需要以下函数。

对列表或已排序的牌组进行排序时,它从最低到最高以 2C (2 个三叶草)开始。

import random

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

er.num) 返回 t1 == t2

    def num_rank(num):
        if num[0] == "A":
            return 14
        if num[0] == "J":
            return 11
        if num[0] == "Q":
            return 12
        if num[0] == "K":
            return 13
        return int(num)

class Deck(object):
    def __init__
        self.m for s in self.suit]


    def isOrdered(self):
        if self. str('2C'):
            return True

标签: pythonpython-3.x

解决方案


您可以将列表与 中的列表进行self.deck比较sorted(self.deck)。如果它们相等,则订购甲板:

from functools import total_ordering

@total_ordering
class Card(object):
    def __init__(self, num, suit):
        self.num = num
        self.suit = suit

    def __str__(self):
        return '%s%s' % (self.num,
                         self.suit)

    def __repr__(self): return str(self)

    def __lt__(self, other):
        t1 = self.suit, self.num_rank
        t2 = other.suit, other.num_rank
        return t1 < t2

    def __eq__(self, other):
        t1 = self.suit, self.num_rank
        t2 = other.suit, other.num_rank
        return t1 == t2

    @property
    def num_rank(self):
        if self.num[0] == "A":
            return 14
        if self.num[0] == "J":
            return 11
        if self.num[0] == "Q":
            return 12
        if self.num[0] == "K":
            return 13
        return int(self.num)

class Deck(object):
    def __init__(self):
        self.num = ['2','3','4','5','6','7','8','9','10','J','Q','K','A']
        self.suit = ['C', 'D', 'H', 'S']
        self.deck = [Card(r, s) for r in self.num for s in self.suit]

    def isOrdered(self):
        print('My deck :', self.deck)
        print('My sorted deck :', sorted(self.deck))

        return self.deck == sorted(self.deck)

d = Deck()
print('Deck.isOrdered() ==', d.isOrdered())

印刷:

My deck : [2C, 2D, 2H, 2S, 3C, 3D, 3H, 3S, 4C, 4D, 4H, 4S, 5C, 5D, 5H, 5S, 6C, 6D, 6H, 6S, 7C, 7D, 7H, 7S, 8C, 8D, 8H, 8S, 9C, 9D, 9H, 9S, 10C, 10D, 10H, 10S, JC, JD, JH, JS, QC, QD, QH, QS, KC, KD, KH, KS, AC, AD, AH, AS]
My sorted deck : [2C, 3C, 4C, 5C, 6C, 7C, 8C, 9C, 10C, JC, QC, KC, AC, 2D, 3D, 4D, 5D, 6D, 7D, 8D, 9D, 10D, JD, QD, KD, AD, 2H, 3H, 4H, 5H, 6H, 7H, 8H, 9H, 10H, JH, QH, KH, AH, 2S, 3S, 4S, 5S, 6S, 7S, 8S, 9S, 10S, JS, QS, KS, AS]
Deck.isOrdered() == False

笔记:

  • 我使用functools.total_orderingdoc),所以只有__eq__并且__lt__是必要的

  • 通过装饰器制作num_rank属性@property

  • 排序现在正在进行(suit, num_rank)- 这就是定义__eq__的方式。__lt__也许isOrdered()应该考虑参数化 -isOrdered(by suit or by num etc...)


推荐阅读