2010-01-31 8 views
13

मेरे पास 2 डी सरणी, आयाम 3x10 है, और मैं मूल्यों से दूसरी पंक्ति में क्रमबद्ध करना चाहता हूं, निम्नतम से उच्चतम मूल्य तक, कोई उपयोगी युक्ति?पायथन में पंक्ति द्वारा 2 डी सरणी को सॉर्ट करने के लिए कैसे?

उत्तर

19

अजगर, दर असल, कोई "2 डी सरणी" है - यह (1 दिन) का निर्माण-इन, और (1 दिन) मानक पुस्तकालय मॉड्यूल array में सरणियों के रूप में सूचीबद्ध करता है। numpy जैसे तृतीय-पक्ष पुस्तकालय हैं जो पाइथन-उपयोग योग्य बहु-आयामी सरणी प्रदान करते हैं, लेकिन निश्चित रूप से आप ऐसे तृतीय पक्ष पुस्तकालयों का उल्लेख करेंगे यदि आप उनमें से कुछ का उपयोग कर रहे थे, बजाय "पाइथन", ? सही -)

तो मैं मान लेंगे कि द्वारा "2 डी सरणी" आप इस तरह के रूप में सूची, की एक सूची मतलब है:

lol = [ range(10), range(2, 12), range(5, 15) ] 

या जैसे - 3 आइटम, प्रत्येक के साथ एक सूची अर्थात आइटम 10 आइटमों के साथ एक सूची है, और "दूसरी पंक्ति" शानदार वस्तु lol[1] होगी। हाँ, बहुत सारी धारणाएं हैं, लेकिन आपका प्रश्न इतनी अस्पष्टता से अस्पष्ट है कि धारणाओं से बचने का कोई तरीका नहीं है - अधिक सटीकता के साथ स्पष्टीकरण के लिए अपना क्यू संपादित करें, और एक उदाहरण !, यदि आप लोगों को अपने दिमाग को पढ़ने की कोशिश कर रहे हैं (और शायद असफल हो) क्योंकि आप वर्तमान में इसे टालना असंभव बनाते हैं।

तो इन मान्यताओं आप एक दूसरे को सॉर्ट करने के लिए आवश्यक क्रम में 3 उप-सूचियों में से प्रत्येक सॉर्ट कर सकते हैं के तहत, उदाहरण के लिए:

indices = range(10) 
indices.sort(key = lol[1].__getitem__) 
for i, sublist in enumerate(lol): 
    lol[i] = [sublist[j] for j in indices] 

यहाँ सामान्य दृष्टिकोण बस, सूचकांकों की रेंज सॉर्ट करने के लिए तो है खेल में सभी sublists को पुन: व्यवस्थित करने के लिए उस उचित क्रमबद्ध श्रेणी का उपयोग करें।

यदि आपको वास्तव में एक अलग समस्या है, तो निश्चित रूप से अलग-अलग समाधान होंगे ;-)।

+0

धन्यवाद, आप वास्तव में अच्छे दिमाग पाठक हैं :))), भविष्य में मैं और अधिक वर्णनात्मक और निर्धारित होगा ..मेरा "असली सवाल" दूसरे – user257522

0

ठीक है, यदि आप मानक पायथन सूचियों के बारे में बात कर रहे हैं, तो यह आसान है: mylist[1].sort()। उदाहरण के लिए:

>>> from random import randint 
>>> a_list = [[randint(1,15) for _ in range(10)] for _ in range(3)] 
>>> print a_list 
[[3, 12, 3, 12, 13, 5, 12, 2, 1, 13], [3, 8, 7, 4, 6, 11, 15, 12, 4, 6], [15, 3, 8, 15, 1, 6, 4, 7, 15, 14]] 
>>> a_list[1].sort() 
>>> print a_list 
[[3, 12, 3, 12, 13, 5, 12, 2, 1, 13], [3, 4, 4, 6, 6, 7, 8, 11, 12, 15], [15, 3, 8, 15, 1, 6, 4, 7, 15, 14]] 
26

आपका "2 डी सरणी" कैसा दिखता है?

उदाहरण के लिए:

>>> a = [ 
    [12, 18, 6, 3], 
    [ 4, 3, 1, 2], 
    [15, 8, 9, 6] 
] 
>>> a.sort(key=lambda x: x[1]) 
>>> a 
[[4, 3, 1, 2], 
[15, 8, 9, 6], 
[12, 18, 6, 3]] 

लेकिन मुझे लगता है कि आप कुछ इस तरह हैं:

>>> a = [ 
    [12, 18, 6, 3], 
    [ 4, 3, 1, 2], 
    [15, 8, 9, 6] 
] 
>>> a = zip(*a) 
>>> a.sort(key=lambda x: x[1]) 
>>> a 
[(6, 1, 9), 
(3, 2, 6), 
(18, 3, 8), 
(12, 4, 15)] 
>>> a = zip(*a) 
>>> a 
[(6, 3, 18, 12), 
(1, 2, 3, 4), 
(9, 6, 8, 15) 
] 
+1

के लिए जरूरी क्रम में उपन्यासियों को सॉर्ट करने के बारे में था 'lambda' के बजाय 'itemgetter (1)' का उपयोग करने पर विचार करें –

6

के बजाय का उपयोग lambda x: x[1] आप प्रकार या छाँटे गए कार्यों की कुंजी के रूप operator.itemgetter उपयोग कर सकते हैं। itemgetter (n) एक फ़ंक्शन बनाता है जो सूची से nth आइटम प्राप्त करता है।

>>> matrix = [ [4,5,6], [1,2,3], [7,0,9]] 
>>> from operator import itemgetter 
>>> sorted(matrix, key=itemgetter(1)) 
[[7, 0, 9], [1, 2, 3], [4, 5, 6]] 
0

यह एक छोटे से समारोह मैं इस उद्देश्य के लिए लिखा है:

def sorted_table(data, column=0, reverse=False): 
    return sorted(data, cmp=lambda a,b: cmp(a[column], b[column]), reverse=reverse) 

वास्तव में, मैं थोड़ा और अधिक जटिल आवश्यकता, दो कॉलम द्वारा तालिका सॉर्ट करने के लिए है जो था। यह पता चला है कि cmp() फ़ंक्शन काफी बहुमुखी है;

def sort_report(data): 
    """Sort report columns: first by value, then by label.""" 
    return sorted(data, cmp=lambda a,b: cmp(b[2], a[2]) or cmp(a[0], b[0])) # label is column 0; value is column 2 

ख और एक, पहले मामले में उलट कर रहे हैं के बाद से लक्ष्य मान इधर-उधर कम करने के लिए उच्च सॉर्ट करने के लिए किया गया था: यह अपने मूल कार्य है।

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