2013-04-03 7 views
6

कहें कि मेरे पास उनके नामों में रोमन अंकों के साथ राजाओं का एक शब्दकोश है, जो कुंजी के रूप में पूर्णांक में रोमन अंक हैं।पायथन: एक कुंजी के एक हिस्से द्वारा एक शब्दकोश में वस्तुओं को सॉर्ट करना?

d = {'Zemco III': 3, 'Usamec XL': 40, 'Usamec VII': 7, 'Robert VIII': 8, 'Usamec XLII': 42, 'Mary XXIV': 24, 'Robert III': 3, 'Robert XV': 15, 'Usamec XLIX': 49}

मैं सबसे पुराने से सबसे कम उम्र के लिए सूची को सॉर्ट करना चाहते हैं, कि Usamec XLII Usamec XLIX से पहले आना चाहिए है। मैं सूची को क्रमबद्ध रूप से क्रमबद्ध करना भी चाहूंगा, यह है कि उमेमेक XLII ज़ेम्को III से पहले आना चाहिए।

मेरे दृष्टिकोण जैसे रोमन संख्या मूल्य से पहले नाम से सॉर्ट करने के लिए था, तो:

x = sorted(d.items(),key=operator.itemgetter(0)) 
y = sorted(x,key=operator.itemgetter(1)) 

हालांकि, क्योंकि रोमन अंकों कुंजी का हिस्सा हैं, मेरे वर्णमाला तरह के रूप में इरादा काम नहीं करता। मेरा सवाल है, क्या मैं कुंजी के एक हिस्से से शब्दकोश को सॉर्ट कर सकता हूं, उदाहरण के लिए यदि मेरी कुंजी ज़ेमो III है, तो क्या मैं अपनी चीजों को किसी भी तरह key.split() [0] के साथ पूरी कुंजी के बजाय सॉर्ट कर सकता हूं? धन्यवाद!

उत्तर

2

key केवल एक ऐसा कार्य है जो एक आइटम प्राप्त करता है और आपको जिस चीज को सॉर्ट करने की आवश्यकता है उसे लौटाता है। यह कुछ भी हो सकता है।

यह (name_without_rightmost_word, number) कुंजी द्वारा आइटम सॉर्ट करता:

lambda item: (item[0].rsplit(None, 1)[0], item[1]) 

 

key.rsplit(None, 1)[0] के मामले में key.split()[0] से बेहतर है:

In [92]: sorted(d.items(), key=lambda (name, num): (name.rsplit(None, 1)[0], num)) 
Out[92]: 
[('Mary XXIV', 24), 
('Robert III', 3), 
('Robert VIII', 8), 
('Robert XV', 15), 
('Usamec VII', 7), 
('Usamec XL', 40), 
('Usamec XLII', 42), 
('Usamec XLIX', 49), 
('Zemco III', 3)] 

तो आप का उपयोग अजगर 3, इस key का उपयोग बहुभाषी नाम।

+0

यह काम किया। धन्यवाद, पावेल! –

+0

एक अनुवर्ती प्रश्न के रूप में, यदि मेरे शब्दकोश का आदेश दिया गया था तो क्या नंबर पहले आया था, फिर नाम, और मैं फिर नाम के पहले भाग से सॉर्ट करना चाहता था? उसी प्रारूप के बाद, मैं प्राप्त करूंगा: 'क्रमबद्ध (डी। साइट्स(), कुंजी = लैम्ब्डा (संख्या, नाम): (num, name.rsplit (कोई नहीं, 1) [0])' लेकिन मैं कुछ कैसे शामिल करूं 'key = operator.itemgetter (1) 'की तरह भी? धन्यवाद –

+0

यदि आप एक ही कुंजी से सॉर्ट कर रहे हैं, तो टुपल समान होना चाहिए: '(name.rsplit (कोई नहीं, 1) [0], num)'। केवल 'लैम्ब्डा' तर्कों का क्रम बदलता है। यदि आपको अभी भी नाम विभाजित करना है तो 'itemgetter' आपकी मदद नहीं करेगा। आपके उलटा हुआ शब्दकोश डुप्लिकेट नंबर कैसे प्रबंधित करेगा? –

0

बस इसे हल कर आप ऐसा कर सकते प्राप्त करने के लिए:

sorted_stuff = sorted([(ord(x[0]), x, y) for x, y in d.items()]) 
final_sorted = [(y,z) for x,y,z in sorted_stuff] 

sorted_stuff इस तरह दिखेगा:

[(77, 'Mary XXIV', 24), (82, 'Robert III', 3)] 

final_sorted ठीक से प्रारूपित किया जाएगा:

[('Mary XXIV', 24), ('Robert III', 3)] 
संबंधित मुद्दे