Python: проверка объекта в списке и переполнение __cmp__

это мой первый раз при переполнении стека, поэтому извините, если формат не совсем подходит для сайта. Я только недавно начал изучать программирование, прошло почти 2 недели. Я изучаю Python из http://openbookproject.net/thinkcs/python/english3e/index.html , и до сих пор все было довольно хорошо, когда я просто застрял на несколько часов. Я много гуглил, но не смог найти правильного решения моей проблемы, так что я здесь.

Я пытаюсь запустить OldMaidGame () без проблем, как описано на канале 17. http://openbookproject.net/thinkcs/python/english3e/ch17.html - Большая часть кода также взята из предыдущей главы.

Я обнаружил, что я не могу заставить работать Deck.remove, Hand.remove_matches или любую другую функцию удаления. После некоторой отладки я узнал что проблема возникает, когда программа проверяет, присутствует ли данная карта в колоде / руке / и т. д. Это никогда не может сравниться. Затем, оглянувшись на в главе (в главе 16) я обнаружил, что «if card in deck / hand / etc: remove (card)» и т. д. просматривает. cmp () объекта, чтобы определить, действительно ли карта существует в колоде / руке / и т. д. Это моя версия cmp после внесения дополнений для 'ace в указанный код из электронной книги.

def __cmp__(self, other):
    """ Compares cards, returns 1 if greater, -1 if lesser, 0 if equal """
    # check the suits
    if self.suit > other.suit: return 1
    if self.suit < other.suit: return -1
    # suits are the same... check ranks
    # check for aces first.
    if self.rank == 1 and other.rank == 1: return 0
    if self.rank == 1 and other.rank != 1: return 1
    if self.rank != 1 and other.rank == 1: return -1
    # check for non-aces.
    if self.rank > other.rank: return 1
    if self.rank < other.rank: return -1
    # ranks are the same... it's a tie
    return 0

Сам cmp кажется прекрасным afaik, конечно, я мог бы использовать несколько советов, как сделать это лучше (например, с чеками с тузом). Поэтому я понятия не имею, почему карта в проверках колоды / руки всегда возвращает ложь. Это была данная функция удаления:

class Deck:
    ...
    def remove(self, card):
        if card in self.cards:
            self.cards.remove(card)
            return True
        else:
            return False

Отчаянно пытаясь заставить ее работать,Я придумал следующее:

class Deck:
    ...
    def remove(self, card):
        """ Removes the card from the deck, returns true if successful """
        for lol in self.cards:
            if lol.__cmp__(card) == 0:
                self.cards.remove(lol)
                return True
        return False

Похоже, все работало нормально, пока я не перешел к другим нерабочим функциям удаления:

class OldMaidHand(Hand):
    def remove_matches(self):
        count = 0
        original_cards = self.cards[:]
        for card in original_cards:
            match = Card(3 - card.suit, card.rank)
            if match in self.cards:
                self.cards.remove(card)
                self.cards.remove(match)
                print("Hand {0}: {1} matches {2}".format(self.name, card, match))
                count = count + 1
        return count

Я снова внес некоторые изменения:

class OldMaidHand(Hand):
    def remove_matches(self):
        count = 0
        original_cards = self.cards[:]
        for card in original_cards:
            match = Card(3 - card.suit, card.rank)
            for lol in self.cards:
                if lol.__cmp__(match) == 0:
                    self.cards.remove(card)
                    self.cards.remove(match)
                    print("Hand {0}: {1} matches {2}".format(self.name, card, match))
                    count = count + 1
        return count

Удаление с карты прошло нормально, но могло выдает ошибку (x нет в списке), когда я пытался удалить совпадение. Еще один наш или около того, я, возможно, тоже смог бы это сработать, но так как уже кажется, что я на ложном пути, так как я не могу исправить исходную карту в колоде / руке / и т.д. пришел сюда в поисках ответов / советов.

Спасибо за чтение, и я очень ценю любую помощь, которую вы можете оказать :)

--------------------- ИЗМЕНИТЬ 1 * >

Это мой текущий код: http://pastebin.com/g77Y4Tjr

--------------------- РЕДАКТИРОВАТЬ 2 * >

I Я пробовал каждый cmp , рекомендованный здесь, и я все еще не могу найти карту с 'in'.

>>> a = Card(0, 5)
>>> b = Card(0, 1)
>>> c = Card(3, 1)
>>> hand = Hand('Baris')
>>> hand.add(a)
>>> hand.add(b)
>>> hand.add(c)
>>> d = Card(3, 1)
>>> print(hand)
Hand Baris contains
5 of Clubs
 Ace of Clubs
  Ace of Spades
>>> d in hand.cards
False
>>> 

Я также пробовал card.py успешно использовал @DSM, и я тоже получаю там ошибки, например, в функции сортировки говорится, что нельзя сравнить два объекта карты.
Мне было интересно, может быть, это проблема с Python 3.2, или, может быть, синтаксис где-то изменился?

16
задан HostileFork 8 October 2012 в 04:39
поделиться