2013-12-13 8 views
22

मैं इस कुंजीपटल डी को उप-कुंजी कुंजी 3 के मूल्य के आधार पर क्रमबद्ध करना चाहता हूं। नीचे देखें:पायथन शब्दकोश मूल्यों के आधार पर अवरोही क्रम में छंटनी

d = { '123': { 'key1': 3, 'key2': 11, 'key3': 3 }, 
     '124': { 'key1': 6, 'key2': 56, 'key3': 6 }, 
     '125': { 'key1': 7, 'key2': 44, 'key3': 9 }, 
    } 

तो अंतिम शब्दकोश इस तरह दिखेगा।

d = { '125': { 'key1': 7, 'key2': 44, 'key3': 9 }, 
     '124': { 'key1': 6, 'key2': 56, 'key3': 6 }, 
     '123': { 'key1': 3, 'key2': 11, 'key3': 3 }, 
    } 

मेरे दृष्टिकोण (अनुसार क्रमबद्ध (ई)) लेकिन जब से key3 का मूल्य एक ही हो सकता है, इसलिए शब्दकोश ई से कुछ खो घ, जिसका प्रमुख key3 का मूल्य होगा और फिर उलट उपयोग से दूसरे ई शब्दकोश बनाने के लिए था चाबियाँ और उनके मूल्य। समझ में आता है?

मैं इसे कैसे पूरा कर सकता हूं? यह एक परीक्षण कोड नहीं है। मैं सिर्फ तर्क को समझने की कोशिश कर रहा हूं।

+1

भविष्य में संदर्भ के लिए किया जाएगा के बाद याद है कि '' dict'' (रों) लगभग किसी भी भाषा में स्वाभाविक परिभाषा से unsorted कर रहे हैं कि लोग। अधिकांश कुंजी/मूल्य मैपिंग डेटा प्रकार हैं। कृपया या तो ज़र्विनक के जवाबों को अर्नर्नर्ट या ओह स्वीकार करें। –

उत्तर

36

Dictionaries do not have any inherent order। या, बल्कि, उनका निहित आदेश "मनमानी लेकिन यादृच्छिक नहीं है", इसलिए यह आपको कोई अच्छा नहीं करता है।

विभिन्न शर्तों में, आपके d और आपके e बिल्कुल सटीक शब्दकोश होंगे।

from collections import OrderedDict 
d = { '123': { 'key1': 3, 'key2': 11, 'key3': 3 }, 
     '124': { 'key1': 6, 'key2': 56, 'key3': 6 }, 
     '125': { 'key1': 7, 'key2': 44, 'key3': 9 }, 
    } 
d_ascending = OrderedDict(sorted(d.items(), key=lambda kv: kv[1]['key3'])) 
d_descending = OrderedDict(sorted(d.items(), 
            key=lambda kv: kv[1]['key3'], reverse=True)) 

मूल d कुछ मनमाने ढंग से आदेश दिया गया है:

क्या आप यहाँ कर सकते एक OrderedDict उपयोग करने के लिए है। d_ascending में ऑर्डर है कि आप सोचा आपके मूल d में था लेकिन नहीं। और d_ascending में वह आदेश है जिसे आप अपने e के लिए चाहते हैं।


तुम सच में एक शब्दकोश के रूप में e उपयोग करने की आवश्यकता नहीं है, तो आप सिर्फ एक विशेष क्रम में d के तत्वों से अधिक तेज़ी से दोहराने में सक्षम होना चाहते हैं, तो आप इस आसान बनाने में कर सकते हैं:

for key, value in sorted(d.items(), key=lambda kv: kv[1]['key3'], reverse=True): 
    do_something_with(key, value) 

यदि आप OrderedDict के बजाय किसी भी बदलाव में सॉर्ट किए गए क्रम में शब्दकोश को बनाए रखना चाहते हैं, तो आप किसी प्रकार का सॉर्टेड शब्दकोश चाहते हैं। कई विकल्प उपलब्ध हैं जो आप पीईपीआई पर पा सकते हैं, कुछ पेड़ों के शीर्ष पर लागू होते हैं, कुछ OrderedDict के शीर्ष पर अन्य जो कि खुद को फिर से व्यवस्थित करते हैं, आदि

4

पाइथन डिक्ट्स को परिभाषा के अनुसार क्रमबद्ध नहीं किया जाता है। आप एक को सॉर्ट नहीं कर सकते हैं, न ही अपने तत्वों के क्रम को नियंत्रित कर सकते हैं कि आप उन्हें कैसे सम्मिलित करते हैं। आप संग्रह देखना चाहते हैं।OrderDict, जो भी लगभग ठीक करने के लिए एक छोटे से ट्यूटोरियल के साथ आता है तुम क्या करने की कोशिश कर रहे हैं क्या: http://docs.python.org/2/library/collections.html#ordereddict-examples-and-recipes

4

आप अवरोही क्रम है और एक शब्दकोश में भंडारण में छँटाई के लिए नीचे दिए गए कोड का उपयोग कर सकते हैं:

 listname = [] 
     for key, value in sorted(dictionaryName.iteritems(), key=lambda (k,v): (v,k),reverse=True): 
      diction= {"value":value, "key":key} 
      listname.append(diction) 
2

सूची

dict = {'Neetu':22,'Shiny':21,'Poonam':23} 
print sorted(dict.items()) 
sv = sorted(dict.values()) 
print sv 

शब्दकोश

d = [] 
l = len(sv) 
while l != 0 : 
    d.append(sv[l - 1]) 
    l = l - 1 
print d` 
17

एक छोटी परीक्षा , सॉर्ट करने के लिए डिक्शनरी आदेश desending है

a1 = {'a':1, 'b':13, 'd':4, 'c':2, 'e':30} 
a1_sorted_keys = sorted(a1, key=a1.get, reverse=True) 
for r in a1_sorted_keys: 
    print r, a1[r] 

उत्पादन

e 30 
b 13 
d 4 
c 2 
a 1 
संबंधित मुद्दे