2015-04-19 6 views
5

में कस्टम सॉर्ट मैं पाइथन 3 सीखने से शुरू कर रहा हूं। मैं सोच रहा हूं कि कस्टम प्रकार कैसे करें। उदाहरण के लिए, मैं जानवरों की एक सूची को निम्न तरीके से क्रमबद्ध करना चाहूंगा: पहले वर्ण आरोही द्वारा क्रमबद्ध करें, फिर लंबाई अवरोही से, फिर अल्फान्यूमेरिक आरोही द्वारा।पाइथन 3

ठीक से सॉर्ट किए जाने पर "चींटी", "एंटेलोप", "ज़ेबरा", "एंटेटर" से बना एक सूची "एंटीटर", "एंटेलोप", "चींटी", "ज़ेबरा" बन जाएगी।

मैंने दस्तावेज़ों पर थोड़ा सा पढ़ा है लेकिन सॉर्ट विधि के लिए "कुंजी" तर्क नहीं मिलता है। कोई उदाहरण? पीएस: यह कॉलेज असाइनमेंट प्रश्न नहीं है। मैं बस थोड़ा सा अजगर के साथ खेलने के लिए देख रहा हूँ।

मैं एक लंबे, लंबे समय पहले जावा सीखा है और तरह कस्टम तरह कुछ को लागू किया है हो सकता है निम्नलिखित:

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

[डॉक्स] (https://docs.python.org/3/howto/sorting.html) बहुत सीधे आगे हैं। ऐसा लगता है कि आपकी तुलना जटिल है, जिसका अर्थ है कि 'cmp_to_key' वह हो सकता है जिसे आप ढूंढ रहे हैं (दस्तावेज़ खोजें)। – alfasin

उत्तर

7

छँटाई कुंजी एक समारोह है कि, एक सूची तत्व को देखते हुए, एक मान देता है कि पायथन जानता है कि कैसे तुलनात्मक रूप से तुलना करें। उदाहरण के लिए, पायथन जानता है कि पूर्णांक और तारों की तुलना कैसे करें।

पायथन टुपल्स और सूचियों की तुलना भी कर सकता है जो चीजों से बना है जो यह जानता है कि तुलना कैसे करें। जिस तरह से टुपल्स और सूचियों की तुलना की जाती है, यह है कि टुपल या सूची में पहले की वस्तुओं को बाद के मूल्यों पर प्राथमिकता मिलती है, जैसा कि आप उम्मीद करेंगे।

अपने मामले में, आपको निम्न कुंजी समारोह बनाना चाहते हैं:

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

अजगर डॉक्स देना 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] नहीं कह सकता था, क्योंकि जानवर को अपरिभाषित किया जाएगा।

संबंधित मुद्दे