क्या अजगर की छंटनी () फ़ंक्शन स्थिर होने की गारंटी है?


95

प्रलेखन कि गारंटी नहीं है। क्या कोई अन्य जगह है जो इसे प्रलेखित किया गया है?

मुझे लगता है कि यह स्थिर हो सकता है क्योंकि सूचियों पर सॉर्ट विधि स्थिर होने की गारंटी है (नोट्स 9 वें बिंदु: "पायथन 2.3 से शुरू होकर, सॉर्ट () विधि स्थिर होने की गारंटी है), और सॉर्ट किया गया कार्यात्मक रूप से समान है। हालाँकि, मुझे ऐसा कोई निश्चित स्रोत नहीं मिला है जो ऐसा कहता हो।

उद्देश्य: मुझे प्राथमिक कुंजी के आधार पर छाँटने की आवश्यकता है और उन मामलों में भी एक माध्यमिक कुंजी है जहाँ दोनों अभिलेखों में प्राथमिक कुंजी समान है। यदि सॉर्ट किए गए () को स्थिर होने की गारंटी दी जाती है, तो मैं द्वितीयक कुंजी पर सॉर्ट कर सकता हूं, फिर प्राथमिक कुंजी पर सॉर्ट कर सकता हूं और परिणाम प्राप्त कर सकता हूं जिसकी मुझे आवश्यकता है।

पुनश्च: किसी भी भ्रम से बचने के लिए, मैं "एक प्रकार स्थिर है अगर यह समान की तुलना करने वाले तत्वों के सापेक्ष क्रम को नहीं बदलने की गारंटी देता है" के अर्थ में स्थिर का उपयोग कर रहा हूं।

जवाबों:


126

हां, मैनुअल का उद्देश्य वास्तव में यह गारंटी देना है कि sortedयह स्थिर है और वास्तव में यह sortविधि के समान ही एल्गोरिदम का उपयोग करता है । मुझे लगता है कि डॉक्स इस पहचान के बारे में 100% स्पष्ट नहीं हैं; डॉक्टर पैच हमेशा खुशी से स्वीकार किए जाते हैं!


2
मैंने पाया है कि अगर मैं ट्यूपल्स या सूचियों को सॉर्ट कर रहा हूं, जब भी "प्राथमिक" सॉर्टिंग कुंजी बराबर होती हैं, तो यह "द्वितीयक" कुंजी द्वारा सॉर्टिंग समाप्त होता है। उदाहरण के लिए, मूल इनपुट को उसी क्रम / क्रम में sorted([(1, 2), (1, 1)])वापस [(1, 1), (1, 2)]करने के बजाय लौटाता है । क्या स्थिरता की गारंटी का मतलब यह नहीं होना चाहिए कि वह मूल [(1, 2), (1, 1)]इनपुट लौटा दे ? उस स्थिति में, आप स्पष्ट हैं और कहते हैंsorted([(1, 2), (1, 1)], key=lambda t: t[0])
code_dredd

10
क्या इस मामले में यह अपेक्षित नहीं है? पायथन डिफ़ॉल्ट रूप से सभी तत्वों के माध्यम से ट्यूपल्स की तुलना करने जा रहा है, न कि पहला "प्राथमिक" एक। यदि आप केवल पहले तत्व को क्रमबद्ध करना चाहते हैं, तो आप keyपैरामीटर को स्पष्ट रूप से पास कर सकते हैं ।
मत्ती ग्रियोनी

2
@code_dredd यह अपेक्षित व्यवहार है। स्थिर-सॉर्ट का बिंदु "सॉर्टिंग कुंजी" का उपयोग करके सॉर्ट किया जाता है, लेकिन दो अलग-अलग तत्वों में एक ही सॉर्टिंग कुंजी एक ही क्रम में होगी। टपल के लिए डिफ़ॉल्ट सॉर्टिंग कुंजी, टपल के सभी तत्व हैं।
मर्दानाड

27

वे स्थिर हैं

वैसे: आप कभी-कभी यह जानकर भी अनदेखा कर सकते हैं कि सॉर्ट और सॉर्ट स्थिर हैं, सिंगल-पास में मल्टी-पास सॉर्ट को मिलाकर।

उदाहरण के लिए, यदि आप प्रकार करना चाहते हैं उनके आधार पर वस्तुओं last_name, first_nameगुण, आप एक पास में यह कर सकते हैं:

sorted_list= sorted(
    your_sequence_of_items,
    key= lambda item: (item.last_name, item.first_name))

टपल तुलना का लाभ उठाते हुए।

यह उत्तर, जैसा है, मूल प्रश्न को शामिल करता है। आगे छँटाई-संबंधी प्रश्नों के लिए, पायथन छँटाई है-कैसे


4
यदि आप सॉर्ट को उल्टा करना चाहते हैं तो यह अवांछित प्रभाव हो सकता है। उदाहरण के लिए जब उत्पादों पर छंटनी हो, तो आप पहले रेटिंग (आरोही क्रम) और फिर कीमत (आरोही भी) पर क्रमबद्ध करना चाहते हैं। यदि आप इसे उल्टा करते हैं, तो आप रेटिंग को अवरोही क्रम में क्रमबद्ध करना चाहते हैं लेकिन आरोही क्रम में मूल्य पर। यह इस समाधान के साथ काम नहीं करता है।
रेमो वेन्ड्ट

2
@RemcoWendt: आप जो वर्णन करते हैं उसके लिए कोई आवश्यकता नहीं थी। किसी भी मामले में, एक तर्क के बजाय विचार करें key= lambda item: (-item.rating, item.price)या आपूर्ति करें । मैं अभी भी आपकी टिप्पणी के उद्देश्य के बारे में निश्चित नहीं हूं, हालांकि। cmpkey
tzot

1
वास्तव में यह एक आवश्यकता नहीं थी, लेकिन इस सूक्ष्म अंतर को इंगित करना चाहता था जब अन्य लोग इसे पढ़ते हैं और आपके समाधान के बीच या पायथन की स्थिर सॉर्ट सुविधा का उपयोग करते हैं।
रेम्को वेन्ड्ट

समझा। दूसरे शब्दों में, जोड़े द्वारा छांटना स्पष्ट है और इस प्रकार बेहतर है, जब तक आप प्रदर्शन के बारे में परवाह नहीं करते हैं। मुझे लगता है कि दो स्थिर प्रकार जोड़े द्वारा एक प्रकार से कुछ अधिक तेज़ होते हैं, हालांकि अंतर नगण्य हो सकता है -?
सर्गेई ओरशनस्कै

8
@tzot मैं उल्लेख करना चाहता हूं, स्थिर छंटाई के लिए हमेशा ऐसी आवश्यकताएं होती हैं। उदाहरण के लिए, मेरे पास टपल (दर, टिप्पणी) की एक सूची है, टिप्पणियों को उस क्रम में सहेजा जाता है जब उन्हें बनाया जाता है, और मैं दर के अनुसार क्रमबद्ध करना चाहता हूं और समय के क्रम को बनाए रखना चाहता हूं, हालांकि, मैंने नहीं बचाया सूची में टाइमस्टैम्प। इसे संक्षेप में कहने के लिए, मैं केवल सूची को दर से क्रमबद्ध करना चाहता हूं, और टिप्पणी को उसी क्रम में रखना चाहता हूं।
wsysuper

3

इस बीच ( संबंधित कमिट ) में दस्तावेज़ बदल गया और वर्तमान दस्तावेज़ sortedस्पष्ट रूप से इसकी गारंटी देता है:

अंतर्निहित sorted()फ़ंक्शन स्थिर होने की गारंटी है। एक सॉर्ट स्थिर है यदि यह बराबर की तुलना करने वाले तत्वों के सापेक्ष क्रम को नहीं बदलने की गारंटी देता है - यह कई पासों में सॉर्ट करने के लिए सहायक है (उदाहरण के लिए, विभाग द्वारा सॉर्ट करें, फिर वेतन ग्रेड द्वारा)।

प्रलेखन का यह हिस्सा पायथन 2.7 और पायथन 3.4 (+) में जोड़ा गया था, इसलिए उस भाषा संस्करण के किसी भी अनुरूप कार्यान्वयन को एक स्थिर होना चाहिए sorted

ध्यान दें कि पायथन के लिए पायथन 2.3 केlist.sort बाद से स्थिर रहा है

  • टिम पीटर्स ने अपने list.sort()कार्यान्वयन को फिर से लिखा - यह एक "स्थिर क्रम" है (आउटपुट में समान क्रम में समान इनपुट दिखाई देते हैं) और पहले की तुलना में तेज है।

मुझे 100% यकीन नहीं है sorted, आजकल यह सरल उपयोग करता है list.sort, लेकिन मैंने इसके लिए इतिहास की जांच नहीं की है। लेकिन यह संभावना है कि यह "हमेशा" प्रयोग किया जाता है list.sort


0

"नया क्या है" अजगर 2.4 के लिये दस्तावेज को प्रभावी ढंग से "आधिकारिक" डॉक्स में आप हालांकि नहीं जरूरत मुद्दा यह है कि हल कर () पहले, एक सूची बनाता है फिर उस पर कॉल प्रकार (), गारंटी के साथ उपलब्ध कराने के हैं। तुम भी सिर्फ स्रोत की जाँच कर सकते हैं, अगर आप वास्तव में चिंतित हैं।


1
क्या आप यह इंगित कर सकते हैं कि वह ऐसा कहाँ कहता है? यह कहता है कि सॉर्ट किया गया () "इन-प्लेस लिस्ट की तरह काम करता है। एसओआरटी ()" और "एक नवगठित कॉपी को सॉर्ट किया जाता है", लेकिन मैं यह नहीं कहता कि यह आंतरिक रूप से सॉर्ट () का उपयोग करता है।
सूंदर - मोनिका

बनाई गई "कॉपी" एक सूची है (जो आपको रिटर्न वैल्यू के रूप में मिलती है), और .ort () को लौटने से पहले उस सूची में कहा जाता है। QED। नहीं, यह एक अप्रमाणित प्रमाण नहीं है, लेकिन जब तक पाइथन का आधिकारिक मानक नहीं है, तब तक आपको वह नहीं मिलेगा।
पीटर हैनसेन

0

पाइथन 3.6 डॉकिंग सॉर्टिंग पर अब कहा गया है कि

सॉर्ट स्थिर रहने की गारंटी है

इसके अलावा, उस दस्तावेज़ में, स्थिर Timsort का लिंक है , जो बताता है कि

Timsort 2.3 संस्करण के बाद से पायथन का मानक सॉर्टिंग एल्गोरिथ्म रहा है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.