在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
函数的简单同源词
非常简单,valuevalue
带有一个简单的秩整数,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,这很有帮助,也谢谢你列出了我需要的一些东西