यदि आप निरंतर शब्दकोश से कुंजी जोड़ने और निकालने की योजना बनाते हैं, तो आप वास्तव में समस्या के लिए उपयुक्त डेटा संरचना का उपयोग करना चाहते हैं-हैश तालिका नहीं है (या हैश तालिका प्लस एक सूची है, SortedOrderedDict
-type के साथ रेसिपी), लेकिन एक संतुलित पेड़ (या समकक्ष, एक वगैरह सूची की तरह)।
यदि आप पीईपीआई में देखते हैं, तो आपको कई विकल्प मिलेंगे। मेरी सिफारिश blist
होगी। भले ही इसकी डेटा संरचना कुछ अन्य लोगों के रूप में इष्टतम नहीं हो सकती है (क्योंकि बी + ट्री एक बाइनरी पेड़ से कहीं अधिक व्यापक है), यह शायद आपके द्वारा चलाए जाने वाले किसी भी उपयोग के मामले के लिए पर्याप्त है। और इसमें एक पूर्ण और अच्छी तरह से परीक्षण इंटरफेस है, जिसमें अच्छी तरह से परीक्षण प्रदर्शन गारंटी शामिल है। और यह अन्य गंभीर परियोजनाओं द्वारा काफी हद तक उपयोग किया जाता है।
यदि आप दुर्लभ मामलों में से एक से निपट रहे हैं जहां वृक्ष प्रदर्शन वास्तव में महत्वपूर्ण है, तो आपको शायद विभिन्न लाल-काले पेड़, स्प्ले पेड़, स्कीप्लिस्ट इत्यादि को देखना चाहिए। मैंने पहले bintrees
का उपयोग किया है, जिसमें एक शानदार इंटरफ़ेस है (उदाहरण के लिए, आप इंडेक्स द्वारा चाबियाँ और मानों तक पहुंच सकते हैं, और पेड़ को भी टुकड़ा कर सकते हैं, साथ ही इसे dict
की तरह व्यवहार कर सकते हैं, और लेखक ने सभी को सोचा है और इससे बचा है संभावित अस्पष्टताएं), लेकिन मैंने गंभीरता से इसका परीक्षण नहीं किया है।
या, यदि आपकी चाबियाँ और मान वास्तव में सभी छोटे पूर्णांक हैं, तो आप पाइथनिक इंटरफेस में सी ++ map<int, int>
को लपेटने के लिए साइथन का उपयोग करने पर विचार करना चाहेंगे। (यह सी ++ map
के शीर्ष पर एक पूरा इंटरफेस प्रदान करने बहुत संभव नहीं है, लेकिन आप अक्सर की जरूरत नहीं है कि वैसे भी।) या, वैकल्पिक रूप से, स्टोर और PyObject*
के बजाय long
तुलना करने के लिए bintrees.FastRBTree
तरह कार्यान्वयन में से एक को संशोधित।
दूसरी तरफ, यदि आप बस एक बार में सभी को शब्दकोश बनाने जा रहे हैं और फिर इसका उपयोग करें, तो एक बहुत आसान जवाब है। इसे सॉर्ट करें, और इसे OrderedDict
में चिपकाएं। तब आपको stdlib के बाहर कुछ भी नहीं चाहिए।
sorted_dict = collections.OrderedDict(sorted(d.iteritems()))
एक और जवाब पर एक टिप्पणी से, आप कहते हैं कि "मैं नए मॉड्यूल स्थापित करने के लिए अनुमति नहीं है ..."
सबसे पहले, यह सुनिश्चित करें कि वास्तव में सच है बनाते हैं। आप शायद उपयोगकर्ता साइट-पैकेज निर्देशिका में मॉड्यूल स्थापित करने की अनुमति है। या, यदि virtualenv
स्थापित है और/या आप अंतर्निहित venv
के साथ 3.3 का उपयोग कर रहे हैं, तो भी बेहतर है, आपको शायद एक venv बनाने और उसमें मॉड्यूल स्थापित करने की अनुमति है।
लेकिन यदि हां, तो आपको क्या करना है blist
/bintrees
/जो भी आपकी परियोजना में फाइलों की प्रतिलिपि बनाना है।
समस्या जो आप चल सकते हैं वह यह है कि इनमें से अधिकतर पैकेजों में सी एक्सटेंशन मॉड्यूल शामिल हैं, जिसका अर्थ है कि आपको उन्हें बनाने में सक्षम होना चाहिए (ठीक है, build_ext -i
उन्हें)। यदि आपके सिस्टम में पाइथन देव फ़ाइलें और एक कंपाइलर टूल श्रृंखला स्थापित नहीं है, तो आप ऐसा नहीं कर सकते हैं। उस स्थिति में, आप सबसे अच्छे शुद्ध पायथन समाधान की तलाश में हैं। bintrees
एक शुद्ध-पायथन कार्यान्वयन के साथ आता है जो धीमे को छोड़कर, सामान्य सी-एक्सटेंशन कार्यान्वयन के समान है। यह अभी भी ओ (लॉग एन) है, बस स्थिर कारक बहुत अधिक है। अगर एन काफी बड़ा है, तो यह अभी भी एक बड़ी जीत है; यदि नहीं, तो यह नहीं हो सकता है।
यदि इसका कोई भी हिस्सा उचित लगता है, लेकिन आपको प्रति उपयोगकर्ता साइट-पैकेज या वर्चुअल एनवी सेट करने में मदद की ज़रूरत है, या अपनी प्रोजेक्ट में मॉड्यूल की प्रतिलिपि बनाना, या जगह में एक्सटेंशन बनाना आदि। आपको शायद मौजूदा प्रश्नों की खोज करनी चाहिए, और यदि आप एक नहीं ढूंढ पाते हैं (यदि किसी अन्य कारण के लिए नहीं है क्योंकि स्थापना के मुद्दों पर विशेषज्ञ हैं, तो डेटा संरचनाओं में विशेषज्ञ नहीं हैं, और हो सकता है यहां तक कि इस सवाल को पढ़ना)।
मेरे कौशल के स्तर के साथ, मेरी अपनी कक्षा क्रमबद्ध (धीमी) से भी धीमी होगी !! :( –
उपयोग करने का मामला क्या है जिसके लिए आपको इसकी आवश्यकता है (वास्तविक समस्या जिसे आप हल करने का प्रयास कर रहे हैं) –
एक वित्तीय बाजार आवेदन, चाबियाँ कीमतें होंगी, मूल्य उस कीमत पर वॉल्यूम होगा। जैसा कि नया डेटा आता है मुझे अपने शब्दकोश को अपडेट करना है, और मैं अपनी स्क्रिप्ट में सबसे अच्छी और सबसे खराब कीमत और उनकी मात्रा कई बार खोजना चाहता हूं। –