2015-04-19 22 views
5

Tôi bắt đầu học Python 3. Tôi tự hỏi làm thế nào để thực hiện một sắp xếp tùy chỉnh. Ví dụ, tôi có thể muốn sắp xếp một danh sách các động vật theo cách sau: sắp xếp theo ký tự đầu tiên tăng dần, sau đó theo chiều dài giảm dần, sau đó bằng chữ số tăng dần.Sắp xếp tùy chỉnh bằng Python 3

Danh sách được tạo thành từ "kiến", "linh dương", "ngựa vằn", "anteater" khi được sắp xếp đúng cách sẽ trở thành "anteater", "linh dương", "kiến", "ngựa vằn".

Tôi đã đọc một chút về tài liệu nhưng không nhận được đối số "khóa" cho phương pháp sắp xếp. Bất kỳ ví dụ nào? PS: đây không phải là câu hỏi chuyển nhượng trường. Tôi chỉ tìm cách chơi đùa với python một chút.

tôi đã học java dài, thời gian dài trước đây và có thể đã thực hiện một cái gì đó tùy loại như sau:

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) khá đơn giản. Có vẻ như so sánh của bạn phức tạp, có nghĩa là 'cmp_to_key' có thể là thứ bạn đang tìm kiếm (tìm kiếm tài liệu). – alfasin

Trả lời

7

Mấu chốt sắp xếp là một chức năng đó, cho một yếu tố danh sách, trả về giá trị Python biết cách so sánh nguyên bản. Ví dụ, Python biết cách so sánh các số nguyên và chuỗi.

Python cũng có thể so sánh các bộ và danh sách bao gồm những thứ mà nó biết cách so sánh. Cách tuple và danh sách được so sánh là các mục trước đó trong tuple hoặc danh sách được ưu tiên hơn các giá trị sau này, giống như bạn mong đợi.

Trong trường hợp của bạn, bạn sẽ muốn thực hiện chức năng chủ yếu sau:

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

mục với các phím nhỏ hơn luôn đi trước trong một danh sách được sắp xếp. Do đó, một nhân vật ban đầu nhỏ hơn làm cho một con vật đến sớm hơn. Nếu hai tên có cùng tên ban đầu, chiều dài tên dài hơn sẽ khiến động vật đến sớm hơn vì độ dài tên âm nhỏ hơn. Cuối cùng, nếu hai tên của động vật có cùng độ dài ban đầu và cùng chiều dài, thì cà vạt sẽ bị vỡ theo thứ tự từ điển.

chương trình này cho thấy làm thế nào để sắp xếp một danh sách với các chức năng chính trên:

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

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

print(animals) 
+1

Đẹp! Tôi không bao giờ nghĩ đến việc sử dụng một danh sách cho mục đích như vậy, điều này thực sự làm cho mọi thứ trở nên dễ dàng hơn nhiều! Nhân tiện, bạn không phải trả lại một danh sách, tuple cũng sẽ làm như vậy! – alfasin

+1

Bạn hoàn toàn đúng. Một bộ tuple là khái niệm tốt hơn như một phím phân loại bởi vì nó không thay đổi. Tôi đã chỉnh sửa câu trả lời của mình cho phù hợp. –

0

Các tài liệu Python cho excellent examples for .sort and sorted()

Điều đó nói rằng:

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

Mấu chốt ở đây là thứ ba thư của mỗi tên động vật. Tôi đã tạo chữ cái thứ ba là khóa sử dụng hàm lambda lambda: animal: animal[2]. Hàm lambda này cho phép tôi chỉ định chữ cái thứ ba, bởi vì tôi không thể chỉ nói key=animal[2], vì động vật sẽ không được xác định.

Các vấn đề liên quan