自定义排序元组列表

时间:2015-09-27 12:17:14

标签: python list sorting data-structures

我几天前才开始学习Python,我想在其中实现我的小项目。我需要按数字值按降序排列foreach (RadioButton rdbtn in myDiv.Controls.OfType<RadioButton>().Where(rdbtn => rdbtn.Checked)) { } 列表,但是如果多个元组的数字相同,则按字母顺序排序。所以我有一个清单,说:

(string, integer)

返回:

tuples = [('ggg', 5), ('aaa', 5), ('bbb', 6), ('zzz', 6)]
tuples.sort(key=lambda score: score[1], reverse=True)

但我想得到的是:

[('bbb', 6), ('zzz', 6), ('ggg', 5), ('aaa', 5)]

在Java中,我刚刚为自定义元组实现了一个比较器:

[('bbb', 6), ('zzz', 6), ('aaa', 5), ('ggg', 5)]

但是我不知道如何在Python的class Pair { public final String s; public final Integer i; public Pair(String s, Integer i) { this.s = s; this.i = i; } } class PairComparator implements Comparator<Pair> { @Override public int compare(Pair p1, Pair p2) { int c = p1.i.compareTo(p2.i); return (c == 0) ? p1.s.compareTo(p2.s) : c * (-1); } } 表达式中这样做。

3 个答案:

答案 0 :(得分:2)

也许最简单的方法是让key返回一个元组并将得分乘以-1。例如:

>>> tuples.sort(key=lambda x: (-x[1], x[0]))
>>> tuples
[('bbb', 6), ('zzz', 6), ('aaa', 5), ('ggg', 5)]

这将按降序对整数进行排序,然后按升序对字符串进行排序。

答案 1 :(得分:1)

您可以根据数字的负面形状进行排序,不要使用reverse=True

>>> >>> tuples.sort(key=lambda x:(-x[1],x[0]))
>>> tuples
[('bbb', 6), ('zzz', 6), ('aaa', 5), ('ggg', 5)]

答案 2 :(得分:0)

另一种选择是使用运算符模块函数operator.itemgetter()对它们进行两次排序。我们首先按升序排序第一个元素,然后按降序排序第二个元素(尽管效率较低)。

In [1]: from operator import itemgetter

In [2]: tuples = [('ggg', 5), ('aaa', 5), ('bbb', 6), ('zzz', 6)]

In [3]: tuples.sort(key=itemgetter(0)) # [('aaa', 5), ('bbb', 6), ('ggg', 5), ('zzz', 6)]

In [4]: tuples.sort(key=itemgetter(1), reverse=True) # sort by 2nd element in descending order

In [5]: tuples
Out[5]: [('bbb', 6), ('zzz', 6), ('aaa', 5), ('ggg', 5)]