2010-02-16 18 views
27

में एक सूची का एक हिस्सा मान लीजिए कि हम एक सूची है दो:क्रमबद्ध जगह

a = [4, 8, 1, 7, 3, 0, 5, 2, 6, 9] 

अब, a.sort() जगह में सूची को सॉर्ट होगा। क्या होगा यदि हम सूची में केवल एक भाग को क्रमबद्ध करना चाहते हैं, तो अभी भी? सी ++ में हम लिख सकते हैं:

int array = { 4, 8, 1, 7, 3, 0, 5, 2, 6, 9 }; 
int * ptr = array; 
std::sort(ptr + 1, ptr + 4); 

क्या पाइथन में ऐसा ही एक तरीका है?

+0

केवल जगह में सॉर्ट करने की आवश्यकता क्यों है? –

+0

मुझे लगता है कि पाइथन में जोड़ने का अनुरोध करना एक अच्छी बात होगी। यह मानक प्रकार() विधि के प्रारंभ और अंत के वैकल्पिक तर्क होंगे। –

+0

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

उत्तर

0

एक और अधिक pythonic समाधान हो सकता है:

# i,j = range to sort. 
a = a[:i] + sorted(a[i:j]) + a[j:] 

इस 'जगह में' पृथक नहीं किया है, लेकिन यह एक कृत्रिम आवश्यकता की तरह लगता है। यह सुनकर खुशी हुई कि यह एक आवश्यकता क्यों हो सकती है। ;)

+20

एक [i: j] = sorted (a [i: j]) बेहतर लगता है – SurDin

+1

अच्छा, क्या कृत्रिम आवश्यकता कुछ समझ में नहीं आती है, मान लीजिए, सूची वास्तव में बहुत बड़ी है? – Headcrab

+1

@SurDin: कृपया इसे एक अलग उत्तर के रूप में पोस्ट करें, कृपया। –

0

आपकी आवश्यकताओं के आधार पर, मैं आपकी खुद की सॉर्ट फ़ंक्शन/रैपर क्लास को एक प्रकार के फ़ंक्शन के साथ बनाने का सुझाव दूंगा जो आपकी आवश्यकता को प्रभावित करता है।

आप डीएसयू मुहावरे या schwartzian परिवर्तन पर विचार कर सकते हैं: http://wiki.python.org/moin/HowTo/Sorting और http://wiki.python.org/moin/PythonSpeed/PerformanceTips देखें। मेरा सुझाव है कि आप 0 तक तब तक सजाने के लिए, I, j और 0 के बीच तत्व फिर से जे। फिर, 0 या वापसी करने के लिए कस्टम तुलना फ़ंक्शन का उपयोग करें यदि x या y शून्य है तो काम करने के लिए सॉर्ट करें! इससे मदद नहीं मिल सकती है, क्योंकि हमने बहुत पहले पाइथन वी 2.4 पार किया था। फिर भी, यह हो सकता है कि आप क्या खोज रहे हैं।

यह उत्तर भरता है, जबकि मैं कोशिश करता हूं कि इसे कम प्रयास के साथ किया जा सकता है!

37

मैं इसे इस तरह से लिखना चाहते हैं:

a[i:j] = sorted(a[i:j]) 

यह नहीं यथा-स्थान या तो तरह है, लेकिन तेजी से अपेक्षाकृत छोटे क्षेत्रों के लिए पर्याप्त है।

कृपया ध्यान दें कि पाइथन केवल ऑब्जेक्ट संदर्भों की प्रतिलिपि बनाता है, इसलिए वास्तविक दंड की तुलना में स्पीड पेनल्टी इतनी बड़ी नहीं होगी जितनी उम्मीद होगी।

+0

ओपी ने वास्तव में पूर्णांक के लिए कहा। पूर्णांक की सरणी के लिए, संदर्भों की प्रतिलिपि वास्तविक मानों की प्रतिलिपि बनाने से काफी तेज़ नहीं होने चाहिए। – log0

+0

प्रश्न यह नहीं बताता है कि सूची में केवल पूर्णांक हो सकते हैं। सी ++ उदाहरण वास्तव में पूर्णांक पर काम करता है, लेकिन इसका मतलब यह नहीं है कि प्रश्न केवल उस तक ही सीमित है। – fviktor

12

अगर a एक numpy सरणी है तो सुलझाने के लिए यथा-स्थान [i, j) रेंज, टाइप करें:

a[i:j].sort() 

उदाहरण:

>>> import numpy as np 
>>> a = np.array([4, 8, 1, 7, 3, 0, 5, 2, 6, 9]) 
>>> a[1:4].sort() 
>>> a 
array([4, 1, 7, 8, 3, 0, 5, 2, 6, 9]) 
-3

आप बस सूची विधि तरह उपयोग कर सकते हैं, उदाहरण के लिए

>>> a = [2,3,1] 
>>> a.sort() 
>>> a 
[1, 2, 3] 
+2

सवाल यह था कि सूची के _part_ को कैसे क्रमबद्ध करें। – ThomasMcLeod

+0

यदि आप किसी सूची को सॉर्ट कर सकते हैं तो आप सूची के प्रत्येक भाग को सॉर्ट कर सकते हैं क्योंकि [i: j] फ़ॉर्म भी एक सूची है – user107852

2

एक और सरल approach.let आप एक सरणी

a = [4, 8, 1, 7, 3, 0, 5, 2, 6, 9] 

है नहीं है और आप इस सरणी का एक हिस्सा क्रमबद्ध करना चाहते हैं, एक शून्य आधारित सूचकांक, यानी में कहते हैं कि सूचकांक 2 से सूचकांक से 7 तत्व 1 से 2.

b = a[2:7+1] 
b.sort() 
a[2:7+1] = b 
0

यहाँ के python wiki

basical से उल्लेख किया गया ly, sorted(list) नई क्रमबद्ध सूची बनाता है हालांकि list.sort() विधि आपको जगह-जगह के लिए मदद कर सकती है।

>>> list = [(3, 5), (4, 7), (1, 5)] 
    >>> sorted(list) 
    [(1, 5), (3, 5), (4, 7)] 
    >>> list.sort() 
    [(1, 5), (3, 5), (4, 7)] 
संबंधित मुद्दे