关于python:对对象列表进行排序,每个对象都包含一个列表

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)

现在您应该可以只使用unsorted_list.sort()