Sorting a list of objects, each containing a list
我正在写一个杜松子酒纸牌游戏,游戏内容是纸牌的集合和混合。一套是3或4张同等级的牌(即9C、9D、9H)。meld是一组同级别的牌(即8C、9C、10C)。我想整理一个融合和集合的组合列表。
卡片的表示方式如下:
1 2 3 4 | class Card: def __init__(self, rank, suit): self.rank = rank self.suit = suit |
卡片存储在卡片组中,如下所示:
1 2 3 4 5 | 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)。
生成的组合列表可以这样组合(合并,然后设置):
1 2 3 4 | 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')] ] |
生成的组合列表应该是这样的(逐卡比较):
1 2 3 4 | 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')] ] |
。
请注意,第二个和第三个card组都是从5c开始的。必须正确分类。如果我们有一个4集,比如2c,3c,4c,5c,我们也隐含地有一个3集,2c,3c,4c。当对这两个集进行排序时,我们希望3集在4集之前。
我尝试过的事情:
1 2 3 | 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)) |
谢谢你的帮助!
编辑:建议使用比较运算符作为答案。下面是这种解决方案的单元测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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) |
。
我相信这可能有助于:
1 2 3 4 5 6 7 8 9 10 11 12 | 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) |
现在您应该可以只使用