Вам не хватает определения 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
См. Также: