2012-12-31 13 views
6

मेरे अजगर स्ट्रिंग की सूची में वर्णमाला क्रम में एक ही लंबाई x की तरह कुछ लेकिन लंबे समय पर्याप्त है:लंबाई के लिहाज से-अनुसार क्रमबद्ध सूची लेकिन, एक कदम

x = ['aaa','ab','aa','c','a','b','ba']  

मैं इस सूची को सॉर्ट करना चाहता है के रूप में: ['a', 'b', 'c', 'aa', 'ab', 'ba', 'aaa'] और मैं दो चरणों में इस प्रकार था:

>>> x.sort() 
>>> x.sort(key=len)  
>>> x 
['a', 'b', 'c', 'aa', 'ab', 'ba', 'aaa'] 

लेकिन मैं एक कदम में की जरूरत है: मैं भी lambda समारोह (taken help) का उपयोग कर बंधे:

>>> x.sort(key=lambda item: (item, len(item))) 
>>> x 
['a', 'aa', 'aaa', 'ab', 'b', 'ba', 'c'] 

लेकिन नहीं के रूप में मैं वांछित:

यह एक कदम में संभव है? मुझे खुश करें।

मेरे अजगर:

~$ python --version 
Python 2.6.6 
+0

मैं 'अजगर-2.6' को' अजगर-2.7' टैग संपादित के रूप में आप स्पष्ट रूप से उल्लेख आप 2.6 का उपयोग कर रहे हैं। –

उत्तर

9

आप टपल के आदेश को गलत तरीके से गोल हो गया। जब पाइथन टुपल्स पर टाइप करता है, तो पहला मान मुख्य सॉर्ट होता है, दूसरा दूसरा सबर्टोर्ट होता है ... - आपका कोड विपरीत क्रम मानता है।

आप लंबाई के आधार पर सॉर्ट करना चाहते हैं, तो वर्णानुक्रम:

>>> x.sort(key=lambda item: (len(item), item)) 
>>> x 
['a', 'b', 'c', 'aa', 'ab', 'ba', 'aaa'] 

संपादित करें: डीएसएम टिप्पणी में बताते हैं के रूप में, अजगर राजधानियों के रूप में पत्र क्रमबद्ध करता पहला, तो लोअरकेस। यदि यह व्यवहार नहीं चाहता है, तो this answer देखें।

+0

आहा! मैंने क्या गलत किया? मैंने बहुत बार कोशिश की। –

+0

@GrijeshChauhan मैं समझाता क्या जवाब में गलत था ... –

+0

यह वास्तव में करता है प्रकार वर्णानुक्रम नहीं मामले मुद्दों की वजह से (लेकिन है कि आसानी से निश्चित होती है।) [मैं मानता ओपी की सूची इस समय सभी लोअरकेस है।] – DSM

1

itertools.grouby() का उपयोग कर:

In [29]: lis = ['aaa','ab','aa','c','a','b','ba'] 
In [30]: list(chain(*[sorted(g) for k,g in groupby(sorted(lis,key=len),key=len)])) 
Out[30]: ['a', 'b', 'c', 'aa', 'ab', 'ba', 'aaa'] 

timeit तुलना:

In [38]: x = ['aaa','ab','aa','c','a','b','ba']*1000 

In [39]: random.shuffle(x) 

#may be in more tricky test cases this would be fast 

In [40]: %timeit sorted(x,key=lambda item: (len(item), item)) 
100 loops, best of 3: 11.3 ms per loop 

In [41]: %timeit list(chain(*[sorted(g) for k,g in groupby(sorted(x,key=len),key=len)])) 
100 loops, best of 3: 7.82 ms per loop 
+2

यह बड़े पैमाने पर प्रतीत होता है। गलत नहीं है, लेकिन ... मैं वास्तव में इसका मूल्य नहीं देखता हूं। –

+1

मुझे अगले व्यक्ति के रूप में 'itertools' पसंद है, लेकिन यह व्हायो-पागल-पागल है! पीएस: आपको 'सूची' कॉल की आवश्यकता नहीं है, 'क्रमबद्ध' 'जी' का उपभोग करेगा और एक सूची तैयार करेगा। – DSM

+0

@ अश्विनी धन्यवाद! .. नई तकनीक :) .. –

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