首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 3中的自定义排序

问Python 3中的自定义排序
EN

Stack Overflow用户
提问于 2015-04-19 05:10:34
回答 1查看 1.5K关注 0票数 7

我开始学习Python 3,我想知道如何执行自定义排序。例如,我可能希望以以下方式对动物列表进行排序:按第一个字符升序排序,然后按长度下降排序,然后按字母数字升序排序。

一个由“蚂蚁”、“羚羊”、“斑马”、“食蚁兽”组成的列表,在正确排序时会变成“食蚁兽”、“羚羊”、“蚂蚁”、“斑马”。

我读过一些关于文档的内容,但是没有完全理解排序方法的“键”参数。有什么例子吗?PS:这不是大学作业问题。我只是想玩一下蟒蛇。

我很久很久以前就学习了java,并且可能已经实现了定制排序,如下所示:

代码语言:javascript
复制
import java.util.*;

public class sortDemo implements Comparator<String> {
    public static void main(String[] args) {
        ArrayList<String> animals = new ArrayList<String>();
        animals.add("ant");
        animals.add("antelope");
        animals.add("zebra");
        animals.add("anteater");

        for (String a:animals){
            System.out.println(a);
        }
        System.out.println();

        // want output to be anteater, antelope, ant, zebra following the sort
        Collections.sort(animals, new sortDemo());

        for (String a:animals){
            System.out.println(a);
        }
    }

    public int compare(String s1, String s2) {
        if (s1.charAt(0) > s2.charAt(0)){
            return 1;
        } else if (s1.charAt(0) == s2.charAt(0)){
            if(s1.length() < s2.length()) {
                return 1;
            } else if (s1.length() == s2.length()) {
                return s1.compareTo(s2);
            } else {
                return -1;
            }
        } else {
            return -1;
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-19 05:18:22

排序键是一个函数,给定一个list元素,它返回Python知道如何进行本地比较的值。例如,Python知道如何比较整数和字符串。

Python还可以比较由它知道如何比较的东西组成的元组和列表。元组和列表的比较方式是,元组或列表中的早期项优先于后面的值,正如您所期望的那样。

在您的示例中,您需要创建以下关键函数:

代码语言:javascript
复制
lambda name: (name[0], -len(name), name)

在排序列表中,具有较小键的项总是出现得更早。因此,一个较小的初始字符会使动物来得更早。如果两个名称具有相同的首字母,则较长的名称长度会导致动物提前出现,因为负名长度较小。最后,如果两个动物的名字具有相同的首字母和相同的长度,那么领带就会被字典顺序打破。

此程序演示如何使用上面的键函数对列表进行排序:

代码语言:javascript
复制
animals = ["ant", "antelope", "zebra", "anteater", "cod", "cat"]

animals.sort(key=lambda name: (name[0], -len(name), name))

print(animals)
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29726068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档