2009-12-09 16 views
17

अध्येताओं में संग्रहीत अजगर शब्दकोश प्रविष्टियों:क्रम में वे धकेल दिया जाता है

एक अजगर शब्दकोश,

>>> myDict = {'first':'uno','second':'dos','third':'tres'} 
myDict = {'first':'uno','second':'dos','third':'tres'} 
>>> myDict 
myDict 
{'second': 'dos', 'third': 'tres', 'first': 'uno'} 

हालांकि यह संभव है पुनः प्राप्त करने के लिए कोई विशेष आदेश (मैपिंग कोई आदेश है), जैसे में संग्रहित है एक सॉर्टेड सूची या एक शब्दकोश से टुपल, मुझे आश्चर्य है कि यदि शब्दकोश को पारित करने के क्रम में एक शब्दकोश को संग्रहीत करना संभव है, तो पिछले उदाहरण में इसका मतलब आंतरिक क्रम {'first':'uno','second':'dos','third':'tres'} और कोई अलग नहीं होगा।

मुझे इसकी आवश्यकता है क्योंकि मैं मानकों को संग्रहीत करने के लिए शब्दकोश का उपयोग कर रहा हूं क्योंकि मैंने उन्हें कॉन्फ़िगरेशन फ़ाइल से पढ़ा है; एक बार पढ़ और संसाधित (मानों को बदल दिया जाता है), उन्हें एक नई कॉन्फ़िगरेशन फ़ाइल में उसी क्रम में लिखा जाना चाहिए जैसा कि वे पढ़े गए थे (यह आदेश वर्णानुक्रम और न ही संख्यात्मक है)।

कोई विचार?

संपादित: कृपया ध्यान दें कि मैं आदेश (सूचियों की तरह) को पुनः प्राप्त करने माध्यमिक तरीकों की तलाश नहीं कर रहा हूँ, लेकिन तरीके एक शब्दकोश बनाने के लिए की अपने आप में आदेश दिया जा (के रूप में यह अजगर के आगामी संस्करणों में हो जाएगा) ।

+2

http://stackoverflow.com/questions/1867861/python-dictionary-keep-keys-values-in-same-order-as-declared –

+0

@ Ofri Raviv: ठीक उसी सवाल। धन्यवाद। – Escualo

+1

चूंकि आप आदेश बनाए रखने की कोशिश कर रहे हैं, यह वास्तव में पहली जगह में एक शब्दकोश नहीं है। आप बहुत सी चीजें कर रहे हैं। आप दोनों शब्दकोश (मैपिंग के लिए) और सूची (ऑर्डर को बनाए रखने के लिए) चाहते हैं। कुछ गलत नहीं है उसके साथ। –

उत्तर

30

कोशिश अजगर 2.7 और इसके बाद के संस्करण, शायद 3.1, वहाँ OrderedDict

है

http://python.org/download/releases/2.7/

आदेश के संरक्षण शब्दकोशों की
>>> from collections import OrderedDict 
>>> d = OrderedDict([('first', 1), ('second', 2), 
...     ('third', 3)]) 
>>> d.items() 
[('first', 1), ('second', 2), ('third', 3)] 

PEP 372: Adding an ordered dictionary to collections

+0

अच्छा है। लेकिन ध्यान रखें कि आने वाली पायथन रिलीज की एक नई सुविधा है और पुराने संस्करणों में उपलब्ध नहीं है। – akr

+0

... लेकिन मैं 2.5.1 के साथ अटक गया हूं :( – Escualo

+3

या इस पैच से ऑर्डर्ड डिक्ट का स्रोत कोड प्राप्त करें: http://bugs.python.org/issue5397 –

4

अजगर में महत्वपूर्ण आदेश

+0

त्वरित और गंदे। हां, बहुत कॉम्पैक्ट नहीं (भंगुर हो सकता है)। –

+0

यह काम करता है, लेकिन अगर कोई है तो मैं एक और "प्राकृतिक" तरीका ढूंढ रहा हूं। ऐसा लगता है कि एस। मार्क द्वारा सुझाए गए ऑर्डर्ड डिक्ट का वह विकल्प है जिसे मैं ढूंढ रहा था। दुर्भाग्यवश मैं पाइथन 2.5.1 के साथ फंस गया हूं :( – Escualo

+1

यदि आप एक ही ऑब्जेक्ट में ताना इंटरफ़ेस के साथ निर्देश और सूची को समाहित नहीं करते हैं। वैसे, वैसे, जो कई आदेशित डिक्ट कार्यान्वयन करते हैं (वास्तव में कार्यान्वयन के बारे में नहीं जानते 2.7 में अपनाया गया –

1

शब्दकोश धारण करने के लिए एक सूची का उपयोग करें जिसके कारण आदेश यादृच्छिक प्रतीत होता है हैश तालिकाओं के रूप में लागू कर रहे हैं। आप एक प्रकार के एक निर्देश के अपने स्वयं के बदलाव को लागू कर सकते हैं, लेकिन आप सुविधाजनक वाक्यविन्यास पर खो देंगे। इसके बजाए, चाबियों के क्रम का भी ट्रैक रखें।

प्रारंभ:

keys = [] 
myDict = {} 

जबकि पढ़ने:

myDict[key] = value 
keys.append(key) 

जबकि लेखन:

for key in keys: 
    print key, myDict[key] 
+0

मेरी चाबियाँ वर्णानुक्रम या संख्यात्मक क्रम में नहीं हैं :(वे कुछ भी हो सकते हैं। – Escualo

+0

आपको किसी भी वाक्यविन्यास पर हारने की आवश्यकता नहीं होगी। बस __get __() और __set __() आदि जैसे विशेष तरीकों को लागू करें ताकि सक्षम हो सके सिंटैक्स का उपयोग जैसे कि ['कुंजी'] और dict ['key1'] = newvalue – Isaac

3

क्रियान्वयन निश्चित रूप से मौजूद है।

this one in Django है, भ्रमित रूप से SortedDict कहा जाता है, जो पायथन> = 2.3 iirc में काम करेगा।

+0

बस ध्यान दिया कि यह Django 1.9 में बहिष्कृत किया जा रहा है। – imns

-2

कि करने के लिए एक बहुत ही कम जवाब नहीं है .. कर this--

dictCopy = yourdictname.copy()

तो dictCopy उपयोग करें, यह एक ही क्रम में हो जाएगा।

+0

पायथन में शब्दकोशों में कोई ऑर्डर नहीं है, इस प्रकार सवाल है। – Escualo

1

सैद्धांतिक भाग की व्याख्या करने की बजाय मैं एक साधारण उदाहरण दूंगा।

>>> from collections import OrderedDict 
>>> my_dictionary=OrderedDict() 
>>> my_dictionary['foo']=3 
>>> my_dictionar['aol']=1 
>>> my_dictionary 
OrderedDict([('foo', 3), ('aol', 1)]) 
संबंधित मुद्दे