具有多个参数的复杂排序?

时间:2012-07-12 10:53:00

标签: python

我有一个元组列表:

li = [('fink', 3), ('flip', 3), ('flock', 4), ('foo', 12), ('foot', 20), ('football', 20), ('futz', 10), ('flip', 3), ('flank', 3), ('flop', 3)]

如何先按下降编号对列表进行排序,然后按字母顺序下降?结果将是:

('foot', 20)
('football', 20)
('foo', 12)
('futz', 10)
('flock', 4)
('fink', 3)
('flip', 3)
('flake', 3)
('flop', 3)

from operator import itemgetter

sorted_li = sorted(li, key=itemgetter(1,0), reverse=True)

虽然上面的代码按正确的降序排序,但单词不按字母顺序排序。

3 个答案:

答案 0 :(得分:10)

对于单个itemgetter来说,这太复杂了。请改用lambda

sorted_li = sorted(li, key=lambda x: (-x[1], x[0]))

与使用itemgetter的两个连续排序的速度大致相同,但代码较少,可能更具可读性。

答案 1 :(得分:6)

由于Python的排序是稳定的,因此最容易排序两次:

sorted_li  = sorted(li, key=itemgetter(1), reverse=True)
sorted_li.sort(key=itemgetter(0))

答案 2 :(得分:0)

由于Python的排序是稳定的,因此最容易进行两次排序:

sorted_li  = sorted(li, key=itemgetter(0))
sorted_li.sort(key=itemgetter(1), reverse=True)

,但是请注意,您必须首先使用最低优先级顺序,然后再使用其他优先级顺序。 最高优先顺序必须是最后一个。 这是您尝试使用Sorted函数时必须考虑的最重要的事情。