2009-02-08 13 views
42

यहाँ शब्दकोश है मैंपाइथन मेरे शब्दकोश का ऑर्डर क्यों कर रहा है?

propertyList = { 
    "id":   "int", 
    "name":   "char(40)", 

    "team":   "int", 
    "realOwner": "int", 

    "x":   "int", 
    "y":   "int", 

    "description": "char(255)", 

    "port":   "bool", 
    "secret":  "bool", 
    "dead":   "bool", 
    "nomadic":  "bool", 

    "population": "int", 
    "slaves":  "int", 
} 

है लेकिन जब मैं इसे प्रिंट के साथ "\ n" .join (myDict) मैं इस

name 
nomadic 
dead 
port 
realOwner 
secret 
slaves 
team 
y 
x 
population 
id 
description 

मिल मुझे पता है कि एक शब्दकोश अव्यवस्थित है, लेकिन इसे हर बार एक ही बाहर आता है और मुझे नहीं पता कि क्यों।

+36

अक्रमित का मतलब है अपने व्यवसाय से कोई भी है । इसका मतलब यह नहीं है कि आदेश असंगत है। –

+1

@ एस। लॉट: निश्चित रूप से। यही कारण है कि मुझे अपने सीएस पाठ्यक्रम पर सिखाया गया है - 'अनियंत्रित संग्रहों में हमेशा कुछ ऑर्डर होगा, * अनॉर्डर्ड * का अर्थ है कि हमें इस पर भरोसा नहीं करना चाहिए' – Abgan

+5

अधिक सटीक: पायथन शब्दकोशों का क्रम आर्बिटरी लेकिन निर्धारिती है (के अनुसार पायथन spec)। जहां निर्धारिती का मतलब है कि यह हमेशा एक ही तरीके से व्यवहार करेगा। –

उत्तर

79

वास्तविक प्रश्न "क्यों नहीं?" होना चाहिए ... एक अनियंत्रित शब्दकोश शायद hash table के रूप में लागू किया गया है (वास्तव में, पायथन documentation यह पूरी तरह से बताता है) जहां तत्वों का क्रम अच्छी तरह परिभाषित है लेकिन तुरंत स्पष्ट नहीं है। आपके अवलोकन पूरी तरह से हैश तालिका के नियमों से मेल खाते हैं: स्पष्ट मनमानी, लेकिन निरंतर क्रम।

+1

पायथन की शब्दकोश स्रोत फ़ाइल से कोई टिप्पणी पढ़ने योग्य है ; मैंने इसे "सबसे अच्छी टिप्पणी जो आपने कभी देखी है" के बारे में पहले से ही एक स्टैक ओवरफ्लो पोस्ट में पोस्ट कर दी है: http://is.gd/iSyN – llimllib

+1

यहां कुछ निर्देशों का आंतरिक कार्यान्वयन http: //www.laurentluce पाया जा सकता है। कॉम/पोस्ट/पायथन-शब्दकोश-कार्यान्वयन /। पाइथन के कोडर में से एक से एक अच्छी प्रस्तुति थी, लेकिन इस समय यह नहीं मिल रहा है (मुझे लगता है कि यह पिकॉन ऑस्ट्रेलिया से था)। –

10

specification में निर्मित शब्दकोश प्रकार के लिए आदेश के किसी भी संरक्षण अस्वीकार करता है, यह सबसे अच्छा key: value जोड़े का एक अव्यवस्थित सेट के रूप में एक शब्दकोश के बारे में सोचना है ...

आप OrderedDict module जाँच करना चाहते हो सकता है, जो कुंजी सम्मिलन आदेश के साथ एक आदेशित शब्दकोश का कार्यान्वयन है।

8

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

>>> {1: 0, 2: 0}, {2: 0, 1: 0} 
({1: 0, 2: 0}, {1: 0, 2: 0}) 
>>> {1: 0, 9: 0}, {9: 0, 1: 0} 
({1: 0, 9: 0}, {9: 0, 1: 0}) 
संबंधित मुद्दे