2013-03-19 10 views
8

मान लीजिए मैं एक शब्दकोशहल क्रम में शब्दकोश में कुंजी जोड़े

{1:5, 2:5, 4:5} 

है है वहाँ एक डेटा संरचना ऐसी है कि अगर मैं कुंजी-मान पेयर 3:5 जोड़ने के लिए, यह शब्दकोश में दर्ज किया गया है करने के लिए है कि इतना है कि कुंजी क्रमबद्ध क्रम में हैं? अर्थात

{1:5, 2:5, 3:5, 4:5} 

मैं collections.OrderedDict() के बारे में पता कर रहा हूँ, लेकिन यह केवल (वर्तमान में मेरे लिए जो पर्याप्त नहीं है) इस क्रम में जोड़ा गया था में कुंजी रहता है।

मैं सामान्य शब्दकोश dic = {} का उपयोग नहीं करना चाहता, तो सबसे छोटी कुंजी को पकड़ने के लिए sorted(dic)[0] का उपयोग करना होगा। मैं sorted_dict[0] प्रकार समारोह होगा।
इसका कारण यह है कि यदि मैं एक सामान्य शब्दकोश का उपयोग करता हूं, तो मुझे कई बार सॉर्ट करना होगा, क्योंकि मैं लगातार अपने शब्दकोश में जोड़े जोड़ रहा हूं।

संपादित करें: मैं उल्लेख किया जाना चाहिए था, यह न केवल सबसे छोटा और सबसे बड़ी कुंजी मैं के बारे में परवाह मैं भी रूप में अच्छी तरह नियमित अंतराल पर इस शब्दकोश मुद्रित करने के लिए की आवश्यकता होगी है, ...

+0

मेरे कौशल के स्तर के साथ, मेरी अपनी कक्षा क्रमबद्ध (धीमी) से भी धीमी होगी !! :( –

+2

उपयोग करने का मामला क्या है जिसके लिए आपको इसकी आवश्यकता है (वास्तविक समस्या जिसे आप हल करने का प्रयास कर रहे हैं) –

+0

एक वित्तीय बाजार आवेदन, चाबियाँ कीमतें होंगी, मूल्य उस कीमत पर वॉल्यूम होगा। जैसा कि नया डेटा आता है मुझे अपने शब्दकोश को अपडेट करना है, और मैं अपनी स्क्रिप्ट में सबसे अच्छी और सबसे खराब कीमत और उनकी मात्रा कई बार खोजना चाहता हूं। –

उत्तर

5

यदि आप निरंतर शब्दकोश से कुंजी जोड़ने और निकालने की योजना बनाते हैं, तो आप वास्तव में समस्या के लिए उपयुक्त डेटा संरचना का उपयोग करना चाहते हैं-हैश तालिका नहीं है (या हैश तालिका प्लस एक सूची है, 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 एक शुद्ध-पायथन कार्यान्वयन के साथ आता है जो धीमे को छोड़कर, सामान्य सी-एक्सटेंशन कार्यान्वयन के समान है। यह अभी भी ओ (लॉग एन) है, बस स्थिर कारक बहुत अधिक है। अगर एन काफी बड़ा है, तो यह अभी भी एक बड़ी जीत है; यदि नहीं, तो यह नहीं हो सकता है।

यदि इसका कोई भी हिस्सा उचित लगता है, लेकिन आपको प्रति उपयोगकर्ता साइट-पैकेज या वर्चुअल एनवी सेट करने में मदद की ज़रूरत है, या अपनी प्रोजेक्ट में मॉड्यूल की प्रतिलिपि बनाना, या जगह में एक्सटेंशन बनाना आदि। आपको शायद मौजूदा प्रश्नों की खोज करनी चाहिए, और यदि आप एक नहीं ढूंढ पाते हैं (यदि किसी अन्य कारण के लिए नहीं है क्योंकि स्थापना के मुद्दों पर विशेषज्ञ हैं, तो डेटा संरचनाओं में विशेषज्ञ नहीं हैं, और हो सकता है यहां तक ​​कि इस सवाल को पढ़ना)।

+2

हाँ, मुझे लगातार शब्दकोश में आइटम जोड़ने और निकालने की ज़रूरत है, इसलिए मुझे हर बार इस तरह के फ़ंक्शन का उपयोग करने की आवश्यकता नहीं है (एन लॉग एन)। यदि आप गंभीर परियोजना के लिए 'ब्लिस्ट' का उपयोग करते हैं, तो अपने ब्लिस्ट समाधान –

+0

पीएस देखेंगे, लेखक डैनियल को ईमेल करें; वह टैब को इस बात पर रखना पसंद करता है कि इसका उपयोग कैसे किया जा रहा है ताकि वह एक दिन में stdlib में शामिल हो सके (जो स्पष्ट रूप से आपके जीवन को आसान बना देगा, क्योंकि आपको इसे पीपीपीआई से इंस्टॉल नहीं करना पड़ेगा)। – abarnert

+0

'ब्लिस्ट' पैकेज से अवगत नहीं था। इसे जांचने के बाद, निश्चित रूप से एक +1। – root

3

यह नुस्खा की कोशिश करो - http://code.activestate.com/recipes/576998-sorted-dictionary/

यह stdlib bisect मॉड्यूल का उपयोग करके क्रमबद्ध कुंजी रखता है।

+1

यह काम करता है, लेकिन यह नौकरी के लिए सही डेटा संरचना का उपयोग करने के रूप में उतना कुशल नहीं होगा। – abarnert

+0

ने इस पृष्ठ पर दिए गए लिंक को भी देखा: http://stutzbachenterprises.com/blist/sorteddict.html। अच्छा, हालांकि मैं काम पर हूं, और मैं इस मॉड्यूल का उपयोग नहीं कर सकता ... –

+0

@XinLiang: यह वही 'ब्लिस्ट' है जिसे मैंने अनुशंसित किया है। आप इस मॉड्यूल का उपयोग क्यों नहीं कर सकते? (यदि आपका मतलब है कि आप अस्पष्ट लाइसेंसिंग के कारण एक्टिवस्टेट से नुस्खा का उपयोग नहीं कर सकते हैं ... मैंने कुछ नियोक्ता के कानूनी विभागों के साथ उस समस्या में भाग लिया है, भले ही मुझे पूरा यकीन है कि स्पष्ट एमआईटी लाइसेंस एएस लाइसेंस को ओवरराइड करता है लेकिन वैसे भी, 'ब्लिस्ट' और 'बिंट्री' बीएसडी-लाइसेंस प्राप्त और एमआईटी लाइसेंस प्राप्त हैं, इसलिए यह कोई समस्या नहीं है। – abarnert

1

पार्टी के लिए एक साल से भी अधिक देर तक, लेकिन मैं sortedcontainers मॉड्यूल का सुझाव देना चाहता था। ब्लिस्ट और बिंट्री की तरह, यह SortedDict डेटा प्रकार प्रदान करता है जो क्रमबद्ध क्रम में कुंजी रखता है। उन मॉड्यूल के विपरीत यह शुद्ध-पायथन में लिखा गया है और वास्तव में तेज़ है। SortedDict भी अनुक्रमण का समर्थन करता है। न्यूनतम/अधिकतम देखकर वास्तव में ओ (1) समय में होता है।

चूंकि यह शुद्ध अजगर है, पिप के साथ स्थापना एक हवा होना चाहिए:

pip install sortedcontainers 

तो फिर तुम बस SortedDict

In [1]: from sortedcontainers import SortedDict 

In [2]: d = SortedDict({1:5, 2:5, 4:5}) 

In [3]: d 
Out[3]: SortedDict({1: 5, 2: 5, 4: 5}) 

In [4]: d[3] = 5 

In [5]: d 
Out[5]: SortedDict({1: 5, 2: 5, 3: 5, 4: 5}) 

आयात कर सकते हैं आप पिप का उपयोग कर बातें कठिनाई को स्थापित करने के लिए है या कर सकते हैं ' टी फाइलों की प्रतिलिपि बनाएँ जिन्हें संकलन की आवश्यकता होगी, फिर आप डिपो से sortedlist.py और sorteddict.py फ़ाइलों को खींच सकते हैं। सभी कोड open source on github है।

सॉर्ट किए गए कंटेनर मॉड्यूल भी एक दूसरे के खिलाफ बेंचमार्क किए गए सबसे लोकप्रिय सुझावों के साथ performance comparison प्रदान करता है।

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