Я только начал изучать Python несколько дней назад, и я хотел реализовать свой маленький проект в нем. Мне нужно отсортировать список (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)]
Но то, что я хочу, чтобы это:
[('bbb', 6), ('zzz', 6), ('aaa', 5), ('ggg', 5)]
В Java я просто реализован компаратор для пользовательского кортеж:
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);
}
}
Но я ' m не уверен, как это сделать в выражении lambda
в Python.
Итак, вы хотите спуститься по номеру и затем подняться по буквам? –
FWIW, Python 2 позволяет использовать собственный параметр функции сравнения для 'sort' (и' max' & 'min'), но в Python 3 он был отключен, поскольку он менее эффективен: функцию пользовательского ключа нужно вызывать только один раз для каждого ключа, но пользовательская функция сравнения вызывается при сравнении _every_. –
Это возможно реализовать пользовательское сравнение в Python 3: создать класс, который реализует методы [rich compare] (https://docs.python.org/3/reference/datamodel.html#object.__lt__). OTOH, встроенный 'sort' (aka Timsort) Python является стабильным, поэтому может быть достаточно просто отсортировать список несколько раз с разными ключами, вместо использования пользовательского сравнения, когда у вас есть сложное требование сортировки. –