पायथन के मानक पुस्तकालयों में कोई सॉर्ट किए गए कंटेनर क्यों नहीं हैं?


84

क्या एक पायथन डिज़ाइन निर्णय (PEP) है जो एक छँटे हुए कंटेनर को पायथन में जोड़े जाने से रोकता है?

( OrderedDictप्रविष्टि क्रम द्वारा आदेशित होने के बाद से सॉर्ट किया गया कंटेनर नहीं है।)


1
संग्रह पसंद है।
उदिमिर

1
यह अभी तेज है। आदेश सेट के लिए हेमप बनाम ओ (लॉग एन) के लिए ओ (1)।
vartec

19
@utdmr: ऑर्डरडीडक्ट प्रविष्टि क्रम के अनुसार क्रमबद्ध किया जाता है - एक मनमाने ढंग से कुंजी द्वारा नहीं, एक सॉर्ट किए गए कंटेनर की तरह।
नील जी

1
@ हाय-एंजेल नं, यह नहीं कि सॉर्ट किए गए कंटेनर का क्या मतलब है। उदा
नील जी

1
"सॉर्ट किए गए कंटेनर वह है जो प्रविष्टि पर तत्वों को सॉर्ट करता है"। बिल्कुल नहीं: मैं कहूंगा कि एक सॉर्ट किया गया कंटेनर एक कंटेनर है जिसका इंटरफ़ेस कुशल सॉर्ट किया गया है (एक मनमाना कुंजी के अनुसार) पुनरावृत्ति और खोज। आपकी गलतफहमी आपकी असामान्य परिभाषा से उपजी है।
नील जी

जवाबों:


77

यह गुइडो के हिस्से पर एक सचेत डिजाइन निर्णय है (वह collectionsमॉड्यूल के अलावा के बारे में कुछ अनिच्छुक भी था )। उसका लक्ष्य "ऐसा करने के लिए एक स्पष्ट तरीका" को संरक्षित करना है जब यह अनुप्रयोगों के लिए डेटा प्रकारों के चयन की बात आती है।

मूल अवधारणा यह है कि यदि कोई उपयोगकर्ता यह महसूस करने के लिए पर्याप्त परिष्कृत है कि बिलिन प्रकार उनकी समस्या का सही समाधान नहीं है, तो वे एक उपयुक्त तीसरे पक्ष के पुस्तकालय को खोजने के कार्य पर भी निर्भर हैं।

यह देखते हुए कि सूची + छँटाई, सूची + हीपैक और सूची + बिसेक्ट उपयोग के कई मामलों को कवर करते हैं जो अन्यथा अंतर्निहित डेटा संरचनाओं पर निर्भर होंगे, और ब्लिस्टर जैसे पैकेज मौजूद हैं, इस स्थान में अधिक जटिलता जोड़ने के लिए एक बड़ी ड्राइव नहीं है मानक पुस्तकालय।

कुछ मायनों में, यह इस तथ्य के समान है कि मानक पुस्तकालय में कोई बहुआयामी सरणी नहीं है, इसके बजाय उस कार्य को न्यूमप्लस लोगों तक पहुंचाना है।


2
धन्यवाद, मैं इस डिजाइन निर्णय के पीछे की प्रेरणाओं की तलाश कर रहा था। यह ठीक उसी तरह का जवाब है जिसकी मुझे तलाश थी। मेरी प्रारंभिक वृत्ति इस तरह से चीजों को करने के लिए नहीं हुई होगी, लेकिन तर्क बहुत आश्वस्त है।
नील जी

collections.Counterसॉर्ट सेट के रूप में इस्तेमाल किया जा सकता है। हालांकि यह कुशल नहीं हो सकता है।
कोडेरेक

1
@ कोडक: collections.Counterएक क्रमबद्ध सेट का प्रतिनिधित्व करने के लिए अनसोल्ड और उपयुक्त नहीं है।
user2357112

लेकिन कम से कम अंतर्निहित शब्दकोश सॉर्ट नहीं होना चाहिए? तत्वों को तेजी से पहुंच प्रदान करने के लिए शब्दकोश को संग्रहित किया जाना चाहिए, यह मुझे अजीब लगता है कि जब आप इस पर पुनरावृति करते हैं, तो आप अभी भी किसी न किसी तरह से अनसुनी वस्तुओं के साथ समाप्त हो जाते हैं।
हाय-एंजेल

1
@ हाय-एंजेल dictएक हैश टेबल है।
नील जी

83

एक अजगर सॉर्टकॉनटेनर मॉड्यूल भी है जो सूची, तानाशाही और सेट प्रकारों को क्रमबद्ध करता है। यह ब्लिस्ट के समान है लेकिन शुद्ध-पायथन में और ज्यादातर मामलों में तेजी से लागू किया जाता है

>>> from sortedcontainers import SortedSet
>>> ss = SortedSet([3, 7, 2, 2])
>>> ss
SortedSet([2, 3, 7])

इसकी अन्य पैकेजों में भी कार्यक्षमता असामान्य है:

>>> from sortedcontainers import SortedDict
>>> sd = SortedDict((num, num) for num in range(100000))
>>> sd.iloc[-5] # Lookup the fifth-to-last key.
99995

डिस्क्लेमर: मैं सॉर्टकॉनटेनर्स मॉड्यूल का लेखक हूं।


1
अच्छा लगा! आप यह निर्दिष्ट करने के लिए अपने दस्तावेज़ को अद्यतन करने पर विचार कर सकते हैं कि अंतर्निहित भंडारण एक रस्सी है
नील जी

1
@ नीलजी धन्यवाद! युगल नोट: शुद्ध पाइथन में ब्लिस्टर नहीं लिखा गया है। सॉर्ट किए गए सेट, सूची, और तानाशाह प्रकार ब्लिस्ट प्रकार पर आधारित होते हैं जो सी में कार्यान्वित बी + होता है। इसके अलावा, अंतर्निहित संरचना वास्तव में रस्सी नहीं है; यह B + -tree के समान है लेकिन केवल एक स्तर के नोड्स हैं।
ग्रांटज

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

1
हाँ, बिल्कुल। यह एक ही तर्क है कि वे इस तरह के डेटा संरचना का उपयोग करने के लिए उपयोग करते हैं, विशेष रूप से लंबे तार जो एक संपादक में उपयोग किए जाते हैं।
नील जी

2
वैसे भी, यह लिखने के लिए धन्यवाद। यदि मुझे इस डेटा संरचना की आवश्यकता है तो मैं इसे ध्यान में रखूंगा।
नील जी

11

वहाँ भी है blist मॉड्यूल है कि एक शामिल sortedset डेटा प्रकार:

sortedset(iterable=(), key=None)

>>> from blist import sortedset
>>> my_set = sortedset([3,7,2,2])
sortedset([2, 3, 7]

5

बिल्कुल "सॉर्ट किए गए कंटेनर" नहीं, लेकिन आपको मानक लाइब्रेरी के बाइसेक्ट मॉड्यूल में रुचि हो सकती है , जो "प्रत्येक प्रविष्टि के बाद सूची को सॉर्ट किए बिना सूची में क्रम बनाए रखने के लिए समर्थन प्रदान करता है"।


1

heapqमानक पुस्तकालय में एक है, यह बिल्कुल हल नहीं है, लेकिन इस तरह का है। एक ब्लिस्टर पैकेज भी है , लेकिन यह मानक पुस्तकालय में नहीं है।


-2

पायथन सूचियों का आदेश दिया जाता है। यदि आप उन्हें छांटते हैं, तो वे उस तरह से बने रहते हैं। पायथन में 2.7 aOrderedDict स्पष्ट रूप से आदेशित शब्दकोश को बनाए रखने के लिए प्रकार जोड़ा गया था।

पायथन में सेट (एक संग्रह जिसमें सदस्यों को अद्वितीय होना चाहिए) भी है, लेकिन परिभाषा के अनुसार वे अनियंत्रित हैं। एक सेट को छाँटना सिर्फ एक रिटर्न देता है list


8
जवाब देने में व़क्त लेने के लिए शुक्रिया। ऑर्डरडीडक्ट को सॉर्ट किए गए कंटेनर की तरह एक मनमानी कुंजी के बजाय सम्मिलन क्रम द्वारा सॉर्ट किया जाता है। सेट भी एक सॉर्ट किए गए कंटेनर नहीं है।
नील जी

1
क्या btree शायद तुम क्या देख रहे हो? stackoverflow.com/questions/628192#628432
jathanism

धन्यवाद, btree बिल्कुल उसी तरह की चीज़ है जिसकी मुझे तलाश थी। जब मैं MacPorts में हूं तो मैं ब्लिस्ट के साथ जा रहा हूं और उसके पास डेटा संरचनाओं का एक गुच्छा है।
नील जी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.