2016-08-24 11 views
6

पर आधारित मिश्रित तारों की क्रमबद्ध सूची क्रमबद्ध करें मैं इस सूची को संख्यात्मक मानों के माध्यम से कैसे क्रमबद्ध करूं? क्या संख्याओं को हटाने के लिए एक रेगेक्स आवश्यक है या ऐसा करने के लिए एक और पाइथोनिक तरीका है?अंक

इस प्रकार
to_sort 

['12-foo', 
'1-bar', 
'2-bar', 
'foo-11', 
'bar-3', 
'foo-4', 
'foobar-5', 
'6-foo', 
'7-bar'] 

वांछित उत्पादन किया जाता है:

1-bar 
2-bar 
bar-3 
foo-4 
foobar-5 
6-foo 
7-bar 
foo-11 
12-foo 
+1

मेरे लिए उपयोग नहीं करना चाहते हैं, सबसे "pythonic" जिस तरह से स्पष्ट है। हमेशा पाइथन-मार्ग सब कुछ करने की कोशिश न करें, लेकिन पठनीयता और अच्छे प्रथाओं पर अधिक ध्यान केंद्रित करें। – Maroun

+0

@idjaw मैंने 'key' के साथ 'क्रमबद्ध' की कोशिश की थी लेकिन नीचे दिए गए उत्तरों ने मुझे बेहतर समझने में मदद की है। – ade1e

+0

@adele हमेशा अपने प्रयास पोस्ट करें, हम हमेशा एक-दूसरे की गलतियों से सीखते हैं। गलत प्रयास बेहद सहायक हैं। – Maroun

उत्तर

10

एक समाधान निम्नलिखित regex निष्कर्षण है:

sorted(l, key=lambda x: int(re.search('\d+', x).group(0))) 

>>> l 
['12-foo', '1-bar', '2-bar', 'foo-11', 'bar-3', 'foo-4', 'foobar-5', '6-foo', '7-bar'] 
>>> sorted(l, key=lambda x: int(re.search('\d+', x).group(0))) 
['1-bar', '2-bar', 'bar-3', 'foo-4', 'foobar-5', '6-foo', '7-bar', 'foo-11', '12-foo'] 

key निकाले अंकों है (करने के लिए परिवर्तितलेक्सोग्राफिक क्रमबद्ध करने से बचने के लिए)।

4

आप regex

>>> l = ['12-foo', '1-bar', '2-bar', 'foo-11', 'bar-3', 'foo-4', 'foobar-5', '6-foo', '7-bar'] 

>>> sorted(l, key = lambda x: int(''.join(filter(str.isdigit, x)))) 

['1-bar', '2-bar', 'bar-3', 'foo-4', 'foobar-5', '6-foo', '7-bar', 'foo-11', '12-foo'] 
+2

यदि इनपुट लंबा है, तो दोनों कार्यान्वयन चलाएं और देखें कि कौन सा तेज़ है। 'फ़िल्टर (std.isdigit, x) 'एक लंबी (प्रति-वर्ण) अस्थायी सूची बनाता है, जो धीमा हो सकता है। – pts

+0

सच है, फ़िल्टर शायद इसके लिए एक genexp से धीमा है। –

+0

मैंने जवाब को चिह्नित किया है क्योंकि यह मेरी समझ में मदद करता है और यह देखना दिलचस्प है कि आपने 'isdigit' का उपयोग कैसे किया। धन्यवाद – ade1e