【问题标题】:Python, how to sort list of object? [duplicate]Python,如何对对象列表进行排序? [复制]
【发布时间】:2018-07-21 11:50:27
【问题描述】:

我有一个看起来像这样的对象列表。

hand = [ Card(10, 'H'), Card(2,'h'), Card(12,'h'), Card(13, 'h'), Card(14, 'h') ]

Card(10, 'H) 这里不是一个元组,而是一个对象。如果列表中的每个项目都是元组的形式,我知道如何对这个列表进行排序,像这样,

hand = sorted(hand, key = lambda x: x[0])

但我不知道如何对对象列表进行排序。我想按第一个输入值对我的列表进行排序,即 Card() 中的数字

我该怎么做?

编辑:这是 Card() 的定义。

class Card(object):

    RANKS = (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)

    SUITS = ('C', 'D', 'H', 'S')

    def __init__(self, rank=12, suit='S'):

        if (rank in Card.RANKS):
            self.rank = rank
        else:
            self.rank = 12

        if (suit in Card.SUITS):
            self.suit = suit.upper()
        else:
            self.suit = 'S'

    def __str__(self):
        if (self.rank == 14):
            rank = 'A'
        elif (self.rank == 13):
            rank = 'K'
        elif (self.rank == 12):
            rank = 'Q'
        elif (self.rank == 11):
            rank = 'J'
        else:
            rank = str(self.rank)
        return rank + self.suit

    def __eq__(self, other):
        return (self.rank == other.rank)

    def __ne__(self, other):
        return (self.rank != other.rank)

    def __lt__(self, other):
        return (self.rank < other.rank)

    def __le__(self, other):
        return (self.rank <= other.rank)

    def __gt__(self, other):
        return (self.rank > other.rank)

    def __ge__(self, other):
        return (self.rank >= other.rank)

【问题讨论】:

  • 您应该为该类实现 __eq____gt____lt__ 方法,以便在比较该类的实例时设置比较逻辑应该是什么样的
  • 定义 Card 会有所帮助...类中命名的变量是什么
  • @Ctznkane525 我刚刚添加了定义
  • 你当前的班级没有排序怎么办?
  • x.rank 是你需要的...下面是什么...只需要知道该属性名称是什么来回答它

标签: python python-3.x sorting object


【解决方案1】:

这个想法还是一样的。只是您将在类对象中寻找特定属性。

对于你的卡片类,你可以这样做:

hand = [ Card(10, 'H'), Card(2,'h'), Card(12,'h'), Card(13, 'h'), Card(14, 'h') ]

那你就可以了

sorted_cards = sorted(hand, key=lambda x: x.rank)

输出看起来像这样:

>>> [card.number for card in sorted_cards]
[2, 10, 12, 13, 14]

【讨论】:

    【解决方案2】:

    这是面向对象的方法。至少,您应该指定 __eq____lt__ 操作以使其工作。然后只需使用sorted(hand)

    class Card(object):
    
        def __init__(self, rank, suit):
            self.rank = rank
            self.suit = suit
    
        def __eq__(self, other):
            return self.rank == other.rank and self.suit == other.suit
    
        def __lt__(self, other):
            return self.rank < other.rank
    
    hand = [Card(10, 'H'), Card(2, 'h'), Card(12, 'h'), Card(13, 'h'), Card(14, 'h')]
    hand_order = [c.rank for c in hand]  # [10, 2, 12, 13, 14]
    
    hand_sorted = sorted(hand)
    hand_sorted_order = [c.rank for c in hand_sorted]  # [2, 10, 12, 13, 14]
    

    最好将对象排序逻辑(如果适用)作为类的属性,而不是在需要排序的每个实例中合并。这样您每次都可以拨打sorted(list_of_objects)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-21
      • 2011-02-24
      • 2013-12-06
      • 1970-01-01
      • 2021-10-28
      • 2012-12-10
      • 1970-01-01
      相关资源
      最近更新 更多