2012-12-02 11 views
21
छँटाई

मैं एक साथ दो सूचियों सॉर्ट करने के लिए कोशिश कर रहा हूँ:अजगर दो सूचियों

list1 = [1, 2, 5, 4, 4, 3, 6] 
list2 = [3, 2, 1, 2, 1, 7, 8] 

list1, list2 = (list(x) for x in zip(*sorted(zip(list1, list2)))) 

वैसे भी, यह कर उत्पादन

list1 = [1, 2, 3, 4, 4, 5, 6] 
list2 = [3, 2, 7, 1, 2, 1, 8] 

जबकि मैं समान संख्या के लिए प्रारंभिक आदेश को बनाए रखना चाहते हैं उस पर मुझे देता है 4 पहली सूची में: मुझे क्या चाहिए

list1 = [1, 2, 3, 4, 4, 5, 6] 
list2 = [3, 2, 7, 2, 1, 1, 8] 

मुझे क्या करना है? मैं बबल-सॉर्टिंग के लिए लूप का उपयोग नहीं करना चाहता। किसी भी मदद की सराहना की।

+0

सुनिश्चित नहीं है कि आपकी आवश्यकता क्या है, क्या आप अधिक विशिष्ट हो सकते हैं? –

+3

@ShawnZhang सूची 1 में समान वस्तुओं के लिए सूची 2 में प्रारंभिक क्रम रखें। –

+0

[बबल सॉर्टिंग] (http://en.wikipedia.org/wiki/Bubble_sort) एक विशेष एल्गोरिदम है जिसे लूपिंग की आवश्यकता होती है। यह भी ध्यान रखें कि आपका दूसरा आउटपुट बबल सॉर्ट आउटपुट के बराबर नहीं है। –

उत्तर

31

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

>>> from operator import itemgetter 
>>> [list(x) for x in zip(*sorted(zip(list1, list2), key=itemgetter(0)))] 
[[1, 2, 3, 4, 4, 5, 6], [3, 2, 7, 2, 1, 1, 8]] 

कौन सा के बराबर है:

>>> [list(x) for x in zip(*sorted(zip(list1, list2), key=lambda pair: pair[0]))] 
[[1, 2, 3, 4, 4, 5, 6], [3, 2, 7, 2, 1, 1, 8]] 
+0

+1। यह भी खूब रही। मुझे बचाने के लिए बहुत बहुत धन्यवाद। –

4

चाल यहाँ है कि जब अजगर तुलना टपल करता है, यह तत्व क्रम में बाएं से दाएं (उदाहरण, (4, 1) < (4, 2) के लिए तुलना करता है, जो कारण है कि आपको अपने विशेष मामले में इच्छित आदेश नहीं मिल रहा है)। इसका मतलब है कि आपको तर्क sorted फ़ंक्शन में गुजरने की आवश्यकता है जो इसे पूरे टुपल की बजाय जोड़ी टुपल के पहले तत्व का उपयोग करने के लिए कहता है।

प्रकार स्थिर होने की गारंटी रहे हैं:

यह आदेश आप चाहते हैं क्योंकि बनाए रखने के लिए गारंटी है। इसका मतलब है कि जब कई अभिलेखों की एक ही कुंजी होती है, तो उनका मूल आदेश संरक्षित होता है।

(source)

>>> list1 = [1, 2, 5, 4, 4, 3, 6] 
>>> list2 = [3, 2, 1, 2, 1, 7, 8] 
>>> 
>>> list1, list2 = (list(x) for x in zip(*sorted(zip(list1, list2), key=lambda pair: pair[0]))) 
>>> 
>>> print list1 
[1, 2, 3, 4, 4, 5, 6] 
>>> print list2 
[3, 2, 7, 2, 1, 1, 8] 
0

आप में क्रमांकन कोड पहले और tuples के दूसरे तत्वों के आधार पर किया जाता है, तो जिसके परिणामस्वरूप दूसरी सूची तत्वों का एक ही तत्व के लिए क्रमबद्ध क्रम में हैं पहली सूची

दूसरी सूची के आधार पर छँटाई से बचने के लिए, बस यह दर्शाते हैं कि केवल पहली सूची से तत्वों tuples के तुलना में इस्तेमाल किया जाना चाहिए:

>>> from operator import itemgetter 
>>> list1, list2 = (list(x) for x in zip(*sorted(zip(list1, list2),key=itemgetter(0)))) 
>>> list1, list2 
([1, 2, 3, 4, 4, 5, 6], [3, 2, 7, 2, 1, 1, 8]) 

itemgetter(0) प्रत्येक टपल, से पहले तत्व लेता है जो पहली सूची से संबंधित है।

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

  • कोई संबंधित समस्या नहीं^_^