Python3.6 में dicts की तरह सेट किए गए हैं




set python-3.6 (2)

Python 3.6 में set s का आदेश नहीं दिया गया है, CPython कार्यान्वयन विवरण के रूप में भी नहीं। एक सरल उदाहरण यह दिखाता है:

>>> import string
>>> string.digits
'0123456789'
>>> set(string.digits)
{'7', '0', '2', '8', '6', '9', '1', '5', '4', '3'}

इस पर अजगर 3 docs स्पष्ट हैं:

एक सेट बिना डुप्लिकेट तत्वों के साथ एक अनियोजित संग्रह है।

पायथन 3.6 में dict कार्यान्वयन में बदलाव के कारण अब इसे डिफ़ॉल्ट रूप से आदेशित किया गया है। क्या अभी भी संरक्षित करने का आदेश दिया गया है?

मुझे इसके बारे में कोई जानकारी नहीं मिल सकी, लेकिन जैसा कि उन दोनों डेटा संरचनाओं में बहुत समान है जिस तरह से वे हुड के तहत काम करते हैं मुझे लगा कि यह मामला हो सकता है।

मुझे पता है कि सभी मामलों में आदेश दिए जाने का कोई वादा नहीं है, लेकिन वे ज्यादातर समय हैं। जैसा कि पायथन डॉक्स में कहा गया है:

इस नए कार्यान्वयन का आदेश-संरक्षण पहलू एक कार्यान्वयन विवरण माना जाता है और इस पर भरोसा नहीं किया जाना चाहिए


नहीं, set s अभी भी अनियंत्रित हैं।

आप इसे केवल एक set को प्रदर्शित करके सत्यापित कर सकते हैं कि "अच्छी तरह से परिभाषित हैश क्रम" 1 होना चाहिए ताकि हम यह सुनिश्चित कर सकें कि हमें गलती से ऐसा कोई set नहीं मिला है जो ऑर्डर किया गया हो लेकिन वास्तव में ऐसा नहीं है:

>>> a_set = {3,2,1}
>>> a_set
{1, 2, 3}
>>> list(a_set)
[1, 2, 3]

यदि यह आदेश दिया गया था तो आप उदाहरणों के परिणामस्वरूप {3, 2, 1} और [3, 2, 1] अपेक्षा करेंगे।

जबकि dict को वास्तव में आदेश दिया जाता है (उदाहरण के लिए थोड़ा सा संशोधित):

>>> a_dict = {3: 3, 2: 2, 1:1}
>>> a_dict
{3: 3, 2: 2, 1: 1}
>>> list(a_dict)
[3, 2, 1]

1 "अच्छी तरह से परिभाषित हैश आदेश":

पूर्णांकों के लिए जो 0 <= integer < sys.hash_info.modulus को 0 <= integer < sys.hash_info.modulus करता है, hash केवल संख्या है। इसका मतलब है कि अगर सेट को हैश के आधार पर "आधारित" और (प्रविष्टि "समय" के आधार पर आदेश नहीं दिया गया है) और हैश मान टकराता नहीं है (इसीलिए मैंने छोटी संख्या और संख्याओं का उपयोग किया है जो केवल एक से भिन्न होते हैं) क्रम नियतात्मक होना चाहिए क्योंकि वे सेट के अंदर स्लॉट्स पर कब्जा करते हैं जो एक दूसरे के बगल में हैं:

  • या तो सबसे छोटे से लेकर सबसे ऊंचे तक
  • या एक विशिष्ट मूल्य से उच्चतम और फिर सबसे छोटे से विशिष्ट मूल्य तक। यह मामला तब होता है जब सेट में अगला (पड़ोसी के अर्थ में) मुफ्त स्लॉट पहले वाला होता है।

बाद के लिए एक उदाहरण के रूप में:

>>> a_set = {6,7,8,9}
>>> a_set
{8, 9, 6, 7}




python-internals