基于主要属性排序,然后是辅助属性

时间:2018-02-09 16:50:09

标签: python class sorting object

我有一个包含对象的类列表。我想根据对象的两个属性对类列表进行排序。某些属性具有相同的值,在这种情况下,我想根据辅助属性对它们进行排序。我该怎么做?我的东西看起来像

f.cards
Out[95]: 
[<__main__.PlayingCard at 0x56d44e0>,
 <__main__.PlayingCard at 0x56d4438>,
 <__main__.PlayingCard at 0x56d4588>,
 <__main__.PlayingCard at 0x56d4390>,
 <__main__.PlayingCard at 0x56d4828>,
 <__main__.PlayingCard at 0x56d4400>,
 <__main__.PlayingCard at 0x56d4358>]
f.cards[0].give_value()
Out[96]: 14
f.cards[0].getSuit()
Out[97]: 'Diamonds'

f.cards[2].give_value()
Out[100]: 14
f.cards[2].getSuit()
Out[101]: 'Hearts'

我的意图是定义一个排序功能,这样我就可以根据他们的价值对牌进行排序,其次是他们的牌。例如打印输出示例,我希望首先放置值为14的卡片,因为它具有套装'Hearts'

我的最后一次尝试是:

elements = sorted([(o.give_value(), o.suit) for o in cards], reverse=True)

2 个答案:

答案 0 :(得分:1)

index将在它调用的列表/元组中找到给定元素的索引。所以例如Clubs将映射到0,Hearts到2.因为我们按元组排序,所以只有当两个卡中第一个元素相等时才考虑第二个元素。

sorted(
    cards,
    key=lambda x: (
        x.give_value(),
       ('Clubs', 'Diamonds', 'Hearts', 'Spades').index(x.getSuit())
    ),
    reverse=True,
)

修改:修正了拼写错误,并根据评论中的建议将[...]更改为(...)

答案 1 :(得分:0)

在python2中,您可以使用函数cmp的可选参数sorted来定义自定义比较函数,如下所示:

def cmp(x, y):
    if x.attr_a != y.attr_a:
        return x.attr_a - y.attr_a
    else:
        return x.attr_b - y.attr_b