पायथन में, list.sort
विधि और sorted
अंतर्निर्मित फ़ंक्शन key
नामक एक वैकल्पिक पैरामीटर स्वीकार करता है, जो एक कार्य है, जो सूची से तत्व को अपनी सॉर्टिंग कुंजी देता है।पायथन: functools cmp_to_key फ़ंक्शन कैसे काम करता है?
पुराने पायथन संस्करणों ने cmp
पैरामीटर का उपयोग करके एक अलग दृष्टिकोण का उपयोग किया, जो कि एक कार्य है, जो सूची के दो तत्वों को ऋणात्मक संख्या देता है यदि पहले दूसरे से कम है, शून्य अगर बराबर और सकारात्मक है यदि पहले बड़ा है तो संख्या। कुछ बिंदु पर, इस पैरामीटर को हटा दिया गया था और पाइथन 3 में शामिल नहीं किया गया था।
दूसरे दिन मैं तत्वों की एक सूची को सॉर्ट करना चाहता था कि cmp
फ़ंक्शन key
एक से लिखना अधिक आसान था। मैं एक बहिष्कृत फीचर का उपयोग नहीं करना चाहता था इसलिए मैंने प्रलेखन पढ़ा और मैंने पाया कि नामक एक मज़ेदार functools
मॉड्यूल में है, जो उसके नाम के राज्यों के रूप में cmp
फ़ंक्शन प्राप्त करता है और key
एक देता है ... या क्या मैंने सोचा था कि जब तक मैं स्रोत कोड (या कम से कम एक बराबर संस्करण) इस उच्च स्तरीय समारोह का पढ़ा docs
def cmp_to_key(mycmp):
'Convert a cmp= function into a key= function'
class K(object):
def __init__(self, obj, *args):
self.obj = obj
def __lt__(self, other):
return mycmp(self.obj, other.obj) < 0
def __gt__(self, other):
return mycmp(self.obj, other.obj) > 0
def __eq__(self, other):
return mycmp(self.obj, other.obj) == 0
def __le__(self, other):
return mycmp(self.obj, other.obj) <= 0
def __ge__(self, other):
return mycmp(self.obj, other.obj) >= 0
def __ne__(self, other):
return mycmp(self.obj, other.obj) != 0
return K
में शामिल तथ्य यह है कि cmp_to_key
काम करता है के रूप में उम्मीद, मैं इस तथ्य यह है कि द्वारा हैरान पाने के बावजूद फ़ंक्शन एक फ़ंक्शन नहीं लौटाता है बल्कि इसके बजाय K
क्लास देता है। क्यूं कर? यह कैसे काम करता है? मेरा अनुमान है कि sorted
फ़ंक्शन आंतरिक रूप से जांचता है कि क्या सीएमपी एक फ़ंक्शन या के वर्ग या कुछ समान है, लेकिन मुझे यकीन नहीं है।
पीएस .: अपनी कठोरता के बावजूद, मैंने पाया कि के वर्ग बहुत उपयोगी है। इस कोड की जाँच करें:
from functools import cmp_to_key
def my_cmp(a, b):
# some sorting comparison which is hard to express using a key function
class MyClass(cmp_to_key(my_cmp)):
...
इस तरह, MyClass के उदाहरण के किसी भी सूची हो सकता है, डिफ़ॉल्ट रूप से, मापदंड my_cmp
ग्रेट स्पष्टीकरण। – abc