[英]Sorting a list of objects, each containing a list
我正在写一个杜松子酒纸牌游戏,它处理卡组和牌组。 一组是3或4张具有相同等级(即9c,9d,9h)的卡。 融合是一系列相同等级(即8c,9c,10c)的纸牌。 我想对合并和集合的组合列表进行排序。
卡的表示方式如下:
class Card:
def __init__(self, rank, suit):
self.rank = rank
self.suit = suit
卡存储在CardGroup中,如下所示:
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')] ]
请注意,第二和第三CardGroup均以5c开头。 请务必对它们进行正确排序。 在我们有4个集合(如2c,3c,4c,5c)的情况下,我们也隐式具有3个集合2c,3c,4c 。 在对这两个进行排序时,我们希望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)
我相信这可能会有所帮助:
class Card:
# ...
def __cmp__(self, other):
r = self.rank.__cmp__(other.rank)
if not r:
return self.suit.__cmp__(other.suit)
return r
class CardGroup:
# ...
def __cmp__(self, other):
return cmp(self.cards, other.cards)
现在您应该只可以使用unsorted_list.sort()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.