2016-04-09 9 views
5

मैं एक presorted सूचीक्रमबद्ध एक और क्रमबद्ध सूची के आधार पर अजगर में एक सूची

presorted_list = ['2C','3C','4C','2D','3D','4D'] 
unsorted_list = ['3D','2C','4D','2D'] 

के आधार पर पायथन में एक सूची क्रमबद्ध करना चाहते हैं वहाँ के बावजूद presorted सूची प्रतिबिंबित करने के लिए सूची को सॉर्ट करने का कोई तरीका है तथ्य यह है कि सभी तत्व अनगिनत सूची में मौजूद नहीं हैं?

मैं परिणाम चाहते हैं कुछ इस तरह देखने के लिए:

after_sort = ['2C','2D','3D','4D'] 

धन्यवाद!

उत्तर

7
In [5]: sorted(unsorted_list, key=presorted_list.index) 
Out[5]: ['2C', '2D', '3D', '4D'] 

या, बेहतर प्रदर्शन के लिए (विशेष रूप से जब len(presorted_list) बड़ी है),

In [6]: order = {item:i for i, item in enumerate(presorted_list)}  
In [7]: sorted(unsorted_list, key=order.__getitem__) 
Out[7]: ['2C', '2D', '3D', '4D'] 

कैसे key s का उपयोग करके सॉर्ट करने के लिए, को देखने के उत्कृष्ट Howto Sort wiki अधिक जानकारी के लिए।


unsorted_list (इस तरह के '6D' के रूप में) आइटम शामिल हैं presorted_list में नहीं तो उपरोक्त विधियों एक त्रुटि बढ़ा देंगे। आपको सबसे पहले यह तय करना होगा कि आप इन वस्तुओं को कैसे क्रमबद्ध करना चाहते हैं। आप उन्हें सूची के अंत में रखा चाहते हैं, आप

In [10]: unsorted_list = ['3D','2C','6D','4D','2D'] 

In [11]: sorted(unsorted_list, key=lambda x: order.get(x, float('inf'))) 
Out[11]: ['2C', '2D', '3D', '4D', '6D'] 

इस्तेमाल कर सकते हैं या यदि आप सूची के सामने ऐसी वस्तुओं जगह करना चाहते हैं,

In [12]: sorted(unsorted_list, key=lambda x: order.get(x, -1)) 
Out[12]: ['6D', '2C', '2D', '3D', '4D'] 
+0

का उपयोग मैं माफी चाहता, मैं मैं इसके लिए नया हूं, लेकिन कोड का पहला बिट मुझे अनसुलझा सूची में पहले आइटम के लिए एक वैल्यू त्रुटि देता है। वैल्यूएरर: '6 डी' सूची में नहीं है –

+0

'। इंडेक्स' अगर मूल्य presorted_list में नहीं है तो एक मान त्रुटि बढ़ाएगी। –

+0

@Danica: यदि आप आइटम _removed_ चाहते हैं जो 'presorted_list' में नहीं हैं, तो 'sorted (itertools.ifilter (lambda x: x में presorted_list, unsorted_list), key = order .__ getitem __) का उपयोग करें। – martineau

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