2009-11-05 10 views
9

द्वारा क्रमबद्ध करें मैंने this post पढ़ा है और मेरे लिए काम नहीं कर रहा है।एक बहुआयामी सूची को कुंजियों की एक चर संख्या

संपादित करें: कार्यक्षमता मैं वर्णन कर रहा हूँ बस Excel में छँटाई समारोह की तरह है कि अगर यह बनाता है ... किसी भी स्पष्ट

यहाँ मेरी स्थिति है, मैं एक टैब-सीमांकित पाठ दस्तावेज़ है। प्रति पंक्ति लगभग 125,000 लाइनें और 6 कॉलम हैं (स्तंभ टैब टैब द्वारा अलग किए जाते हैं)। मैंने दस्तावेज़ को दो-आयाम सूची में विभाजित कर दिया है।

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

अभी भी उलझन में होना चाहता हूं?

यहां एक उदाहरण है जो मैं करना चाहता हूं।

Joel 18 Orange 1 
Anna 17 Blue 2 
Ryan 18 Green 3 
Luke 16 Blue 1 
Katy 13 Pink 5 
Tyler 22 Blue 6 
Bob  22 Blue 10 
Garrett 24 Red 7 
Ryan 18 Green 8 
Leland 18 Yellow 9 

मैं अपने जादुई कार्य करने के लिए इस सूची को पारित कर दिया है, इसलिए की तरह कहते हैं:

sortByColumn(bigList, 0) 

Anna 17 Blue 2 
Bob  22 Blue 10 
Garrett 24 Red 7 
Joel 18 Orange 1 
Katy 13 Pink 5 
Leland 18 Yellow 9 
Luke 16 Blue 1 
Ryan 18 Green 3 
Ryan 18 Green 8 
Tyler 22 Blue 6 

और ...

sortByColumn(bigList, 2, 3) 

Luke 16 Blue 1 
Anna 17 Blue 2 
Tyler 22 Blue 6 
Bob  22 Blue 10 
Ryan 18 Green 3 
Ryan 18 Green 8 
Joel 18 Orange 1 
Katy 13 Pink 5 
Garrett 24 Red 7 
Leland 18 Yellow 9 

कोई सुराग?

उत्तर

11
import operator: 
def sortByColumn(bigList, *args) 
    bigList.sort(key=operator.itemgetter(*args)) # sorts the list in place 
+0

यह शानदार है। मैंने कभी आइटमजटर (या घुसपैठिए, जिसे मैं अब भी देखता हूं) के बारे में कभी नहीं सुना था। –

+2

यह आपके लिए गिडो की टाइम मशीन है। http://catb.org/jargon/html/G/Guido.html –

+0

यह वही है जो मैं ढूंढ रहा हूं। आपका बहुत बहुत धन्यवाद! –

8

यह कॉलम 2 और 3 के आधार पर सॉर्ट देगा:

a.sort(key=operator.itemgetter(2,3)) 
1

, सुनिश्चित करें कि आप ints के लिए संख्या परिवर्तित कर दिया है बनाओ अन्यथा वे करेंगे तरह वर्णानुक्रम बजाय संख्यानुसार

# Sort the list in place 
def sortByColumn(A,*args): 
    import operator 
    A.sort(key=operator.itemgetter(*args)) 
    return A 

या

# Leave the original list alone and return a new sorted one 
def sortByColumn(A,*args): 
    import opertator 
    return sorted(A,key=operator.itemgetter(*args)) 
2

यहां मुख्य विचार (पन इरादा) एक महत्वपूर्ण कार्य का उपयोग करना है जो एक ट्यूपल देता है। नीचे, मुख्य कार्य lambda x: (x[idx] for idx in args) x एक सूची के तत्व के बराबर सेट है - यानी, डेटा की एक पंक्ति। यह मूल्यों का एक गुच्छा देता है, केवल एक मूल्य नहीं। सॉर्ट() विधि सूची के पहले तत्व के अनुसार टाइप करती है, फिर दूसरे के साथ संबंध तोड़ती है, और इसी तरह। देखें http://wiki.python.org/moin/HowTo/Sorting#Sortingbykeys

#!/usr/bin/env python 
import csv 
def sortByColumn(aList,*args): 
    aList.sort(key=lambda x: (x[idx] for idx in args)) 
    return aList 

filename='file.txt' 
def convert_ints(astr): 
    try: 
     return int(astr) 
    except ValueError: 
     return astr  
biglist=[[convert_ints(elt) for elt in line] 
     for line in csv.reader(open(filename,'r'),delimiter='\t')] 

for row in sortByColumn(biglist,0): 
    print row 

for row in sortByColumn(biglist,2,3): 
    print row 
+1

संख्याओं को इनट्स –

+0

में परिवर्तित करना होगा अच्छा बिंदु, gnibbler। फिक्स्ड। – unutbu

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