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