Экземпляр класса сортировки Python, содержащий список с кортежами - PullRequest
0 голосов
/ 25 ноября 2018

Это упражнение 18.2 из книги «Думай о питоне».Существует класс под названием Deck, который создает колоду карт в виде списка кортежей [(0,1), (0, 2)...].Класс определил внутренние функции shuffle() и sort().Функция shuffle() работает правильно, но когда я пытаюсь отсортировать колоду, записанная мной функция sort() не возвращает отсортированную колоду.

Понятия не имею, почему это так.Любой намек, что я делаю не так?

class Deck(object):
    """Represents deck of cards
        attributes: list of cards
    """
    def __init__(self):
        self.cards = []
        for suit in range(4):
            for rank in range(1, 14):
                card = Card(suit, rank)
                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()


new_deck = Deck()
print '>>>>>>>>>>>>>>>>>>>>new deck:'
print new_deck

new_deck.shuffle()
print '>>>>>>>>>>>>>>>>>>>>shuffled deck:'
print new_deck

new_deck.sort()
print '>>>>>>>>>>>>>>>>>>>>sorted deck:'
print new_deck

1 Ответ

0 голосов
/ 25 ноября 2018

Вам не хватает определения Card - также вы создаете экземпляры Card вместо использования tuple.Функция sort() сортирует кортежи поэлементно, используя следующий элемент один, когда происходит розыгрыш первого:

[ (0,1),(0,-2) ].sort() 

приводит к

[ (0,-2),(0,1) ] # because draw on (0,_)

Для вашего Card 'Класс Python не знает, как его сортировать, поэтому он использует функцию id() (если вы не скажете ему, как сортировать себя, см. ниже).

Вы можете определить key для своего звонка на sort(...) или определить метод Card.__lq__() на своих карточках, чтобы он не использовал id() при сортировке карточек:

import random

class Card(object):
    # fancier output
    s = {0:"hearts",1:"diamonds",2:"clubs",3:"spades"}
    r = {i:v for i,v in enumerate( [ "Ace","2","3","4","5","6","7","8",
                                     "9","10","Jack","Queen","King"],1)}
    def __init__(self, suit,rank):
        self.suit = suit
        self.rank = rank

    def __str__(self):
        return "{} of {}".format(Card.r[self.rank],Card.s[self.suit])

    def __repr__(self):
        return str(self)

    # UNCOMMENT to not need the sort-key() in Deck
    # def __lt__(self,other):
    #    return (self.suit,self.rank) < (other.suit, other.rank)

class Deck(object): 
    # keep the rest of your code, fix this: 
    # or uncomment __lq__() in Cards (which would be the prefered 
    # way to do it) and leave your method as is
    def sort(self):
        # tell sort to sort based on what key 

        self.cards.sort(key = lambda x: (x.suit, x.rank))


new_deck = Deck()
print '# new deck:'
print new_deck

new_deck.shuffle()
print '# shuffled deck:'
print new_deck

new_deck.sort()
print '# sorted deck:'
print new_deck

Вывод (сокращенный):

# new deck:
Ace of hearts   ... up to ...  King of hearts
Ace of diamonds ... up to ...  King of diamonds
Ace of clubs    ... up to ...  King of clubs
Ace of spades   ... up to ...  King of spades

# shuffled deck:
6 of hearts
7 of spades
# ... snipp the remaining mixed cards ...
2 of hearts
King of diamonds

# sorted deck:
Ace of hearts   ... up to ...  King of hearts
Ace of diamonds ... up to ...  King of diamonds
Ace of clubs    ... up to ...  King of clubs
Ace of spades   ... up to ...  King of spades

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...