【问题标题】:Sorting a list of objects, each containing a list对对象列表进行排序,每个对象都包含一个列表
【发布时间】:2015-03-20 06:42:34
【问题描述】:

我正在编写一个处理纸牌组合和融合的杜松子酒纸牌游戏。一组是 3 或 4 张具有相同等级的牌(即 9c、9d、9h)。融合是一系列相同等级的牌(即 8c、9c、10c)。我想对融合和集合的组合列表进行排序。

卡片表示如下:

class Card:
  def __init__(self, rank, suit):
    self.rank = rank
    self.suit = suit

卡片存储在 CardGroups 中,如下所示:

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 开头。正确排序这些很重要。在我们有一个像 2c,3c,4c,5c 这样的 4-set 的情况下,我们也隐含了一个 2c,3c,4c 的 3-set。在对这两个进行排序时,我们希望 3-set 在 4-set 之前。

我尝试过的事情:

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)

【问题讨论】:

  • 在你的类中定义比较操作可能更好。 Example
  • 感谢@Marcin 的提醒!

标签: python sorting


【解决方案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()

【讨论】:

  • 漂亮!谢谢@Amadan。我会写我自己的,并与你的比较。干杯。
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 2013-10-17
相关资源
最近更新 更多