2012-03-03 17 views
11

छँटाई से परिणाम का उपयोग कर मुझे लगता है मैं मुट्ठी सूची को सॉर्ट और दूसरी सूची को सॉर्ट करने परिणाम का उपयोग करना चाहेंगे अजगरपायथन में एक सूची छंटाई एक और सूची

में
list_1 = [5, 2, 8]; 
list_2 = ['string1', 'string2', 'string3'] 

दो सूचियों की है।

दूसरे शब्दों में, परिणाम होना चाहिए:

# Sorted in descending order 
list_1_sorted = [8, 5, 2]; 
list_2_sorted = ['string3', 'string1', 'string2']; 

मैं जानता हूँ कि व्यक्तिगत रूप से इन सूचियों में से प्रत्येक को सॉर्ट करने के लिए कैसे, लेकिन मैं कैसे अन्य सूची को क्रमबद्ध करने से उत्पन्न सूचकांक के क्रमचय का उपयोग कर एक सूची दूसरे स्थान पर रखना कर सकते हैं?

+2

यह अभी भी स्पष्ट नहीं है कि "अन्य के परिणाम का उपयोग करें" से आपका क्या मतलब है। उदाहरण यह नहीं बताता है कि आप दोनों सूचियों को स्वतंत्र रूप से क्यों क्रमबद्ध करना चाहते हैं। – prelic

+3

@prelic: वह 'list_1' को सॉर्ट करना चाहता है, और 'list_2' ऑर्डर करने के लिए उसी क्रमपरिवर्तन का उपयोग करना चाहता है। विस्तृत स्पष्टीकरण के लिए – Amadan

उत्तर

19

Schwartzian transform

list_1_sorted, list_2_sorted = zip(*sorted(zip(list_1, list_2), 
    key=operator.itemgetter(0), reverse=True)) 
+1

उह, मैं यह जानना चाहता था कि इसे एक लाइनर बनाने के लिए अनपॅकिंग का उपयोग कैसे किया जाए, लेकिन पर्याप्त तेज़ नहीं था। इसके लिए +1 और "श्वार्टज़ियन ट्रांसफॉर्म"। – Wilduck

+1

'कुंजी' यहां अनावश्यक है क्योंकि यह पहले से ही टुपल्स के लिए प्राकृतिक सॉर्ट ऑर्डर है। जब तक आप जानबूझकर इस तरह की स्थिति को अस्थिर बनाना नहीं चाहते हैं कि 'list_1' में डुप्लिकेट हैं ... –

16

एक साथ सूचियों ज़िप, प्रकार, सूची अनज़िप:

together = zip(list_1, list_2) 
sorted_together = sorted(together) 

list_1_sorted = [x[0] for x in sorted_together] 
list_2_sorted = [x[1] for x in sorted_together] 

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

>>> a = [1,3,7,3,2] 
>>> b = ["one","two",'three','four','five'] 
>>> zip(a,b) 
[(1, 'one'), (3, 'two'), (7, 'three'), (3, 'four'), (2, 'five')] 

तब जब आप उन्हें सॉर्ट, वे तत्व युग्मित रहते हैं:

>>> sorted(zip(a,b)) 
[(1, 'one'), (2, 'five'), (3, 'four'), (3, 'two'), (7, 'three')] 

फिर बाकी सब कुछ इन सूचियों को अनपैक करना है।

+0

+1। –

3

आप zip उपयोग कर सकते हैं:

>>> list_1 = ['string1', 'string2', 'string3'] 
>>> list_2 = [5, 2, 8] 
>>> s = sorted(zip(list_2, list_1), reverse=True) 
>>> list_1_sorted = [e[1] for e in s] 
>>> list_2_sorted = [e[0] for e in s] 
>>> list_1_sorted 
['string3', 'string1', 'string2'] 
>>> list_2_sorted 
[8, 5, 2] 
>>> 
2

@ इग्नेसियो के जवाब सबसे अच्छा है, लेकिन सिर्फ मामले में आप नई सूची बनाने के बिना यथा-स्थान सूचियों तरह करने की जरूरत है , आप इसे आजमा सकते हैं:

import itertools 
list_enumerate = itertools.count() 

list_2.sort(reverse=True, key=lambda k: list_1[next(list_enumerate)]) 
list_1.sort(reverse=True) 
print list_1 
print list_2 

ध्यान दें कि मुझे नहीं लगता कि key फ़ंक्शन प्रत्येक सूची आइटम के लिए (जो काम करने के लिए आवश्यक है) क्रम में कहा जाता है, इसलिए यह उपयोग करने के लिए एक जोखिम भरा तरीका है।

+0

पायथन में "स्थानांतरित करने की आवश्यकता" जैसी कोई चीज़ नहीं है। आप हमेशा वापस असाइन कर सकते हैं, और यदि आप स्मृति-लेआउट स्तर पर ऑप्टिमाइज़ेशन के बारे में चिंतित हैं, तो आप वैसे भी गलत भाषा का उपयोग कर रहे हैं। –

+0

[dodumentation] (http://wiki.python.org/moin/HowTo/Sorting/#Key_Functions) का कहना है मुख्य कार्य "ठीक एक बार प्रत्येक इनपुट रिकार्ड के लिए" और "पहले तुलना करने के लिए प्रत्येक सूची तत्व पर बुलाया" है । मैं इसे लगभग गारंटी के रूप में ले जाऊंगा जिसे उन्हें सही क्रम में भी बुलाया जाता है। –

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