2009-12-16 17 views
58

documentation इसकी गारंटी नहीं देता है। क्या कोई अन्य जगह है जिसे इसे दस्तावेज किया गया है?क्या पाइथन सॉर्ट किया गया है() फ़ंक्शन स्थिर होने की गारंटी है?

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

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

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

उत्तर

78

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

+2

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

+1

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

0

"What's New" docs for Python 2.4 प्रभावी ढंग से उस बिंदु को बनाते हैं जो क्रमबद्ध करता है() पहले एक सूची बनाता है, फिर उस पर सॉर्ट() को कॉल करता है, जो आपको "आधिकारिक" दस्तावेज़ों में आवश्यक गारंटी के साथ प्रदान करता है। यदि आप वास्तव में चिंतित हैं, तो आप स्रोत को भी देख सकते हैं।

+1

क्या आप यह कह सकते हैं कि यह कहां कहता है? यह कहता है क्रमबद्ध() "इन-प्लेस list.sort()" और "एक नव निर्मित प्रतिलिपि की तरह काम करता है", लेकिन मुझे यह नहीं लगता कि यह आंतरिक रूप से सॉर्ट() का उपयोग करता है। – sundar

+0

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

21

वे stable हैं। यद्यपि आपको यह जानने की आवश्यकता नहीं है कि सॉर्ट और सॉर्ट किए गए हैं या नहीं, क्योंकि एकाधिक कुंजी होने पर आपको दो चरणों में सॉर्ट करने की आवश्यकता नहीं है।

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

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

टपल तुलना का लाभ लेने के।

यह उत्तर, जैसा मूल है, मूल प्रश्न को शामिल करता है। आगे सॉर्टिंग से संबंधित प्रश्नों के लिए, Python Sorting How-To है।

+4

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

+2

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

+1

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

1

यह शायद इस दौरान बदल लेकिन sorted की वर्तमान प्रलेखन स्पष्ट रूप से इसे garantuees:

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

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