2010-02-22 23 views
11

के बराबर मैं पाइथन में एक सी ++ प्रोग्राम पोर्ट कर रहा हूं। ऐसे कुछ स्थान हैं जहां यह std::set का उपयोग उन वस्तुओं को संग्रहीत करने के लिए करता है जो अपने स्वयं के तुलना ऑपरेटर को परिभाषित करते हैं। मैं एक सामान्य शब्दकोश उपयोग करने की कोशिश के बाद से अजगर मानक पुस्तकालय std::set का कोई समकक्ष (किसी क्रमित मुख्य-मान मैपिंग डेटा संरचना) है और फिर इसे छँटाई, जब पुनरावृत्ति इस तरह:पायथन समकक्ष :: std :: set और std :: multimap

def __iter__(self): 
    items = self._data.items() 
    items.sort() 
    return iter(items) 

हालांकि, रूपरेखा है कि सभी ने दिखा दिया है .sort() से __cmp__ पर कॉल एक गंभीर बाधा हैं। मुझे एक बेहतर डेटा संरचना की आवश्यकता है - अनिवार्य रूप से एक क्रमबद्ध शब्दकोश। क्या किसी को मौजूदा कार्यान्वयन के बारे में पता है? यह विफल होने पर, मुझे यह कैसे लागू करना चाहिए इस पर कोई सिफारिशें? प्रदर्शन प्रदर्शन लिखने से प्रदर्शन अधिक महत्वपूर्ण है और समय स्मृति से अधिक महत्वपूर्ण है।

बोनस अंक यदि यह प्रति कुंजी एकाधिक मानों का समर्थन करता है, जैसे C++ std::multimap

ध्यान दें कि OrderedDict कक्षा मेरी आवश्यकताओं के अनुरूप नहीं है, क्योंकि यह प्रविष्टि के क्रम में आइटम लौटाती है, जबकि मुझे उनकी __cmp__ विधियों का उपयोग करके क्रमबद्ध करने की आवश्यकता होती है।

उत्तर

5

सॉर्ट किए गए शब्दकोश के लिए, आप पाइथन के टाइम्सोर्ट की स्थिर प्रकृति का उपयोग कर सकते हैं: मूल रूप से, वस्तुओं को आंशिक रूप से सॉर्ट करें, आवश्यकता होने पर अंत में आइटम संलग्न करें, "गंदा" ध्वज स्विच करना, और शेष को पहले क्रमबद्ध करें बार-बार दोहराना। विवरण और कार्यान्वयन के लिए यह प्रविष्टि देखें (ए मार्टेलि का उत्तर): Key-ordered dict in Python

3

पायथन में इसके लिए अंतर्निहित डेटा-संरचनाएं नहीं हैं, हालांकि bisect मॉड्यूल उपयुक्त सॉर्टर्ड एल्गोरिदम के साथ क्रमबद्ध सूची रखने के लिए कार्यक्षमता प्रदान करता है।

यदि आपके पास सॉर्ट की गई कुंजी की एक सूची है, तो आप इसे multimap जैसी कार्यक्षमता प्रदान करने के लिए collections.defaultdict(list) के साथ जोड़ सकते हैं।

0

अपनी पुस्तक "Programming in Python 3" में, मार्क समरफील्ड एक क्रमबद्ध शब्दकोश वर्ग प्रस्तुत करता है। स्रोत कोड this zip archive में उपलब्ध है - SortedDict.py के लिए देखो। सॉर्टेड डिक्ट क्लास को पुस्तक में विस्तार से वर्णित किया गया है (जिसे मैं बहुत ज्यादा अनुशंसा करता हूं)। यह तुलना के लिए मनमानी कुंजी का समर्थन करता है और प्रति मान कई मान (जो कि पाइथन में कोई भी शब्दकोश करता है, इसलिए यह इतना बड़ा सौदा नहीं है, मुझे लगता है)।

5

आपको sort(key=...) का उपयोग करना चाहिए।
आपके द्वारा उपयोग किया जाने वाला मुख्य कार्य उस सीएमपी से संबंधित होगा जिसका आप पहले से उपयोग कर रहे हैं। लाभ यह है कि मुख्य समारोह को एन गुना कहा जाता है जबकि सीएमपी को एनएलएल एन बार कहा जाता है, और आम तौर पर कुंजी आधा काम करता है जो सीएम

यदि आप अपना __cmp__() शामिल कर सकते हैं तो हम शायद आपको यह दिखा सकते हैं कि इसे कैसे परिवर्तित करें एक महत्वपूर्ण कार्य

यदि आप संशोधनों के बीच बहुत सारे पुनरावृत्तियों कर रहे हैं, तो आपको क्रमबद्ध वस्तुओं के मूल्य को कैश करना चाहिए।

+0

डेटा संरचनाओं के बारे में सीधे सवाल का जवाब नहीं देते हुए इसने प्रदर्शन में सुधार करने में निश्चित रूप से मदद की है। +1 – EMP

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