python - 元组列表的自定义排序

标签 python list sorting data-structures

前几天才开始学习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);
    }
}

但我不确定如何在 Python 的 lambda 表达式中执行此操作。

最佳答案

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

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

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

关于python - 元组列表的自定义排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32807791/

相关文章:

python - FFT 不计算傅里叶变换

python - 自定义排序列表,了解一些项目的顺序

c++ - 对结构 vector 进行排序

css - 如何让 vim 在一行中按字母顺序对 CSS 规则进行排序?

python - 使用 lxml 在另一个元素之后追加元素

python - 核心 CPython 的 C 扩展模块的测试在哪里?

python - 在 agg 函数中使用一个属性聚合多列

python - 正确初始化列表

c# - 将一个列表添加到另一个为空或不为空的列表

C# 列表按两列排序