我几天前才开始学习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);
}
}
表达式中这样做。
答案 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)]