यह एक पुराना प्रश्न है, लेकिन मेरे द्वारा पोस्ट किए गए कुछ उत्तर वास्तव में काम नहीं करते हैं क्योंकि zip
यह स्क्रिप्ट करने योग्य नहीं है। अन्य उत्तर परेशान नहीं हुएimport operator
इस मॉड्यूल और इसके लाभों के बारे में अधिक जानकारी प्रदान हैं।
इस समस्या के लिए कम से कम दो अच्छे मुहावरे हैं। आपके द्वारा दिए गए उदाहरण इनपुट से शुरू:
X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [ 0, 1, 1, 0, 1, 2, 2, 0, 1 ]
आर। श्वार्ट्ज के बाद इसे श्वार्टजियन_ट्रांसफॉर्म के रूप में भी जाना जाता है जिन्होंने 90 के दशक में पर्ल में इस पैटर्न को लोकप्रिय बनाया:
# Zip (decorate), sort and unzip (undecorate).
# Converting to list to script the output and extract X
list(zip(*(sorted(zip(Y,X)))))[1]
# Results in: ('a', 'd', 'h', 'b', 'c', 'e', 'i', 'f', 'g')
ध्यान दें कि इस मामले में Y
और X
क्रमबद्ध हैं और तुलनात्मक रूप से। यही है, पहले आइटम (से Y
) की तुलना की जाती है; और यदि वे समान हैं तो दूसरी वस्तुओं (से X
) की तुलना की जाती है, और इसी तरह। यह अस्थिर आउटपुट तब तक बना सकता है जब तक कि आप लेक्सोग्राफ़िक ऑर्डर के लिए मूल सूची सूचक को अपने मूल क्रम में डुप्लिकेट रखने के लिए शामिल नहीं करते हैं।
यह आपको इनपुट को क्रमबद्ध करने के तरीके के बारे में अधिक प्रत्यक्ष नियंत्रण प्रदान करता है, जिससे आप केवल क्रमबद्ध करने के लिए विशिष्ट कुंजी को बताकर छँटाई स्थिरता प्राप्त कर सकते हैं । यहाँ और अधिक उदाहरण देखें ।
import operator
# Sort by Y (1) and extract X [0]
list(zip(*sorted(zip(X,Y), key=operator.itemgetter(1))))[0]
# Results in: ('a', 'd', 'h', 'b', 'c', 'e', 'i', 'f', 'g')