Python 3中的自定义排序

时间:2015-04-19 05:10:35

标签: java python sorting

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

由" ant"," antelope"," zebra"," anteater"组成的列表正确分类后会变成"食蚁兽","羚羊","蚂蚁","斑马"。

我已经阅读了一些关于文档的内容,但没有完全得到关键字" sort方法的参数。任何例子? PS:这不是大学的作业问题。我只是想和python一起玩。

很久很久以前我学习了java,可能已经实现了类似下面的自定义排序:

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;
        }
    }
}

2 个答案:

答案 0 :(得分:7)

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

Python还可以比较由知道如何比较的事物组成的元组和列表。比较元组和列表的方式是元组或列表中的早期项目优先于后面的值,就像您期望的那样。

在您的情况下,您需要进行以下键功能:

lambda name: (name[0], -len(name), name)

键较小的项目总是在排序列表中较早出现。因此,较小的初始特征会使动物更早出现。如果两个名称具有相同的首字母,则较长的名称长度会导致动物更早出现,因为负名称长度较小。最后,如果两个动物的名字具有相同的初始长度和相同的长度,则按字典顺序打破平局。

该程序演示了如何使用上述键功能对列表进行排序:

animals = ["ant", "antelope", "zebra", "anteater", "cod", "cat"]

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

print(animals)

答案 1 :(得分:0)

Python文档提供excellent examples for .sort and sorted()

那说:

animals = ["Anteater", "Aardvark", "Eagle", "Platypus"]
sorted(animals, key=lambda animal: animal[2])
['Platypus', 'Eagle', 'Aardvark', 'Anteater']

这里的关键是每个动物名字的第三个字母。我使用lambda函数lambda: animal: animal[2]将第三个字母作为密钥。这个lambda函数允许我指定第三个字母,因为我不能只说key=animal[2],因为动物将是未定义的。