2015-04-19 2 views
5

Я начинаю изучать Python 3. Мне интересно, как выполнить пользовательский сортировку. Например, я могу отсортировать список животных следующим образом: сортировать по первому символу по возрастанию, затем по убыванию длины, затем по алфавиту по возрастанию.Custom sort in Python 3

Список, составленный из «муравьев», «антилоп», «зебра», «муравьед» при правильной сортировке, станет «муравьед», «антилопа», «муравей», «зебра».

Я немного почитал документы, но не совсем понимаю аргумент «ключ» для метода сортировки. Любые примеры? 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; 
     } 
    } 
} 
+0

[docs] (https://docs.python.org/3/howto/sorting.html) довольно прямолинейны. Похоже, что ваше сравнение сложное, что означает, что 'cmp_to_key' может быть тем, что вы ищете (поиск документов). – alfasin

ответ

7

Сортировочный ключ является функцией, которая, учитывая элемент списка, возвращает значение что 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

Ницца! Я никогда не думал о том, чтобы использовать список для этой цели, это действительно делает вещи намного проще! Кстати, вам не нужно возвращать список, кортеж будет делать тот же трюк! – alfasin

+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: animal: animal[2]. Эта функция лямбда позволила мне указать третью букву, потому что я не мог просто сказать key=animal[2], так как животное было бы неопределенным.