我在写一个杜松子酒纸牌游戏,处理纸牌的组合和混合。一套是3或4张等级相同的牌(即9c、9d、9h)。混合牌是一系列等级相同的牌(即8c、9c、10c)。我想对混合和集合的组合列表进行排序。你知道吗
卡片是这样表示的:
class Card:
def __init__(self, rank, suit):
self.rank = rank
self.suit = suit
卡片存储在卡片组中,如下所示:
class CardGroup:
def __init__(self, card_list):
self.cards = []
for c in card_list:
self.cards.append(c)
下面是一个手的例子2c,2h,2d,4h,5d,5s,5c,6c,7c,8c:
这只手上的混血儿都是和棍棒打交道的:(5c,6c,7c)和(6c,7c,8c)。设置为(2c,2d,2h)和(5c,5d,5s)。你知道吗
生成的组合列表可能会这样组合(先合并,然后设置):
unsorted_list = [ CardGroup([Card(5,'c'), Card(6,'c'), Card(7,'c')],
CardGroup([Card(6,'c'), Card(7,'c'), Card(8,'c')],
CardGroup([Card(2,'c'), Card(2,'d'), Card(2,'h')],
CardGroup([Card(5,'c'), Card(5,'d'), Card(5,'s')] ]
产生的组合列表应存在(卡片比较):
sorted_list = [ CardGroup([Card(2,'c'), Card(2,'d'), Card(2,'h')],
CardGroup([Card(5,'c'), Card(5,'d'), Card(5,'s')],
CardGroup([Card(5,'c'), Card(6,'c'), Card(7,'c')],
CardGroup([Card(6,'c'), Card(7,'c'), Card(8,'c')] ]
请注意,第二个和第三个卡片组都以5c开头。重要的是要正确分类。在我们有一个像2c,3c,4c,5c这样的4-集的情况下,我们也隐含地有一个2c,3c,4c的3-集。在对这两个进行排序时,我们希望3集在4集之前。你知道吗
我尝试过的事情:
unsorted_list.sort(key=lambda x: x.cards)
unsorted_list.sort(key=lambda x: x.cards[0])
unsorted_list.sort(key=lambda x: tuple(x.cards))
谢谢你的帮助!你知道吗
编辑:建议使用比较运算符作为答案。下面是这种解决方案的单元测试:
Class TestCard:
def test___cmp__(self):
card1 = Card(5, 'd')
card2 = Card(6, 'c')
card3 = Card(6, 's')
self.assertLessEqual(card1.__cmp__(card2), -1)
self.assertLessEqual(card1.__cmp__(card3), -1)
self.assertEqual(card1.__cmp__(card1), 0)
self.assertGreaterEqual(card2.__cmp__(card1), 1)
self.assertLessEqual(card2.__cmp__(card3), -1)
self.assertGreaterEqual(card3.__cmp__(card1), 1)
self.assertGreaterEqual(card3.__cmp__(card2), 1)
我相信这会有帮助:
现在您应该可以只使用
unsorted_list.sort()
。你知道吗相关问题 更多 >
编程相关推荐