दिलचस्प पोस्ट
किसी अन्य ड्रॉपडाउन में चयन के आधार पर ड्रॉपडाउन सूचियों पर विकल्पों को गतिशील रूप से कैसे पॉप्युलेट करना है? अक्षर को पायथन में फ़ाइल से पढ़ना जावा में एक अर्रे पर सूची का उपयोग कब करना है? StandardOutput.ReadToEnd () लटका हुआ है एसक्यूएल सर्वर: गतिशील जहां-खंड java.lang.NoClassDefFound त्रुटि: javax / mail / authenticator, क्या गलत है? मैट्रिक्स को एक कॉलम में कैसे सेट करें, मैट्रिक्स डेटा प्रकार बनाए रखें, पंक्ति / स्तंभ नाम बनाए रखें? श्रेणी के आधार पर आर के चर वैलिएबल बनाएँ क्यों प्रदर्शन के लिए वजन नीडि़त खराब है? वैकल्पिक? Enum वर्ग क्यों सादे enum से अधिक पसंद है? awk / sed: एक रिकर्सिव कैसे खोज / एक स्ट्रिंग की जगह है? मैं यह कैसे निर्धारित करूं कि यह PHP के साथ एक मोबाइल डिवाइस है? jQuery के साथ इनपुट फ़ील्ड का परिवर्तन प्रकार HTML5 कैनवास में एकल पिक्सेल सेट करने का सबसे अच्छा तरीका क्या है? क्या मुझे SQL सर्वर में थोड़ी फ़ील्ड को अनुक्रमणिका चाहिए?

{…} नोटेशन को ओवरराइड करें, इसलिए मुझे एक आदेश () के बजाय एक ऑर्डर किए गए डिक्ट () मिलता है?

मैं एक .py फ़ाइल का उपयोग करना चाहता हूं जैसे कि एक config फाइल इसलिए {...} संकेतन का उपयोग कर मैं स्ट्रिंग्स को कुंजियों के रूप में एक शब्दकोश बना सकता हूं लेकिन एक मानक अजगर शब्दकोश में परिभाषा क्रम खो गया है

मेरा प्रश्न: क्या {...} संकेतन को ओवरराइड करना संभव है, ताकि मुझे किसी OrderedDict() बजाय OrderedDict() प्राप्त हो?

मैं उम्मीद कर रहा था कि ऑर्डरर्ड डिक्ट ( dict = OrderedDict ) के साथ काम करने वाले dict = OrderedDict को आसानी से काम करना पड़ेगा, लेकिन ऐसा नहीं होगा।

उदाहरण के लिए:

 dict = OrderedDict dictname = { 'B key': 'value1', 'A key': 'value2', 'C key': 'value3' } print dictname.items() 

आउटपुट:

 [('B key', 'value1'), ('A key', 'value2'), ('C key', 'value3')] 

Solutions Collecting From Web of "{…} नोटेशन को ओवरराइड करें, इसलिए मुझे एक आदेश () के बजाय एक ऑर्डर किए गए डिक्ट () मिलता है?"

आप जो पूछ रहे हैं उसे वस्तुतः प्राप्त करने के लिए, आपको अपनी फ़ाइल के सिंटैक्स ट्री के साथ बेला होना है। मुझे नहीं लगता कि ऐसा करना उचित है, लेकिन मैं कोशिश करने के लिए प्रलोभन का विरोध नहीं कर सका। तो अब हम शुरू करें।

पहले, हम फ़ंक्शन my_execfile() साथ एक मॉड्यूल बनाते हैं जो अंतर्निहित my_execfile() तरह कार्य करता है, सिवाय इसके कि शब्दकोश की सभी घटनाओं, जैसे {3: 4, "a": 2} को स्पष्ट कॉल द्वारा प्रतिस्थापित किया जाता है dict() कन्स्ट्रक्टर, जैसे dict([(3, 4), ('a', 2)]) । (बेशक हम उन्हें collections.OrderedDict() लिए कॉल करके सीधे स्थानांतरित कर सकते हैं। आदेश दिया collections.OrderedDict() , लेकिन हम बहुत घुसपैठ नहीं होना चाहते हैं।) यहां कोड है:

 import ast class DictDisplayTransformer(ast.NodeTransformer): def visit_Dict(self, node): self.generic_visit(node) list_node = ast.List( [ast.copy_location(ast.Tuple(list(x), ast.Load()), x[0]) for x in zip(node.keys, node.values)], ast.Load()) name_node = ast.Name("dict", ast.Load()) new_node = ast.Call(ast.copy_location(name_node, node), [ast.copy_location(list_node, node)], [], None, None) return ast.copy_location(new_node, node) def my_execfile(filename, globals=None, locals=None): if globals is None: globals = {} if locals is None: locals = globals node = ast.parse(open(filename).read()) transformed = DictDisplayTransformer().visit(node) exec compile(transformed, filename, "exec") in globals, locals 

जगह में इस संशोधन के साथ, हम dict को ओवरराइट करके शब्दकोश प्रदर्शित करने के व्यवहार को संशोधित कर सकते हैं । यहाँ एक उदाहरण है:

 # test.py from collections import OrderedDict print {3: 4, "a": 2} dict = OrderedDict print {3: 4, "a": 2} 

अब हम इस फाइल को my_execfile("test.py") का उपयोग कर चला सकते हैं, आउटपुट दे सकते हैं

 {'a': 2, 3: 4} OrderedDict([(3, 4), ('a', 2)]) 

ध्यान दें कि सादगी के लिए, उपरोक्त कोड शब्दकोश की अभिव्यक्तियों को नहीं छूती है, जिसे dict() कन्स्ट्रक्टर को दिए गए जनरेटर अभिव्यक्तियों में परिवर्तित किया जाना चाहिए। DictDisplayTransformer वर्ग को आपको visit_DictComp() विधि जोड़ने की आवश्यकता होगी उपरोक्त उदाहरण कोड को देखते हुए, यह सीधे-आगे होना चाहिए।

दोबारा, मैं इस प्रकार की भाषा सिमेंटिक के साथ घूमने की सलाह नहीं देता हूं। क्या आपने ConfigParser मॉड्यूल को देखा है?

यहां एक हैक है जो लगभग आपको सिंटैक्स देता है जो आप चाहते हैं:

 class _OrderedDictMaker(object): def __getitem__(self, keys): if not isinstance(keys, tuple): keys = (keys,) assert all(isinstance(key, slice) for key in keys) return OrderedDict([(k.start, k.stop) for k in keys]) ordereddict = _OrderedDictMaker() 
 from nastyhacks import ordereddict menu = ordereddict[ "about" : "about", "login" : "login", 'signup': "signup" ] 

संपादित करें: किसी ने इसे स्वतंत्र रूप से खोजा, और odictliteral पर ओडिक्टिटिटल पैकेज प्रकाशित किया है जो थोड़ी अधिक गहन कार्यान्वयन प्रदान करता है

आदेश दिया गया "मानक अजगर सिंटैक्स" नहीं है, हालांकि, कुंजी-मान जोड़े (मानक अजगर सिंटैक्स में) का आदेश दिया गया सेट बस है:

 [('key1 name', 'value1'), ('key2 name', 'value2'), ('key3 name', 'value3')] 

स्पष्ट OrderedDict प्राप्त करने के लिए:

 OrderedDict([('key1 name', 'value1'), ('key2 name', 'value2'), ('key3 name', 'value3')]) 

एक अन्य विकल्प, dictname.items() को सॉर्ट करने के लिए है dictname.items() , अगर आपको यह ज़रूरत है:

 sorted(dictname.items()) 

आप जो पूछ रहे हैं वह असंभव है, लेकिन अगर JSON वाक्यविन्यास में कोई कॉन्फ़िग फाइल पर्याप्त है तो आप json मॉड्यूल के साथ कुछ ऐसा कर सकते हैं:

 >>> import json, collections >>> d = json.JSONDecoder(object_pairs_hook = collections.OrderedDict) >>> d.decode('{"a":5,"b":6}') OrderedDict([(u'a', 5), (u'b', 6)]) 

मैंने पाया एक समाधान अजगर को पैच करने के लिए ही है, जिससे dict को ऑर्डर करने का क्रम याद रखना है।

यह तब सभी प्रकार की वाक्यविन्यास के लिए काम करता है:

 x = {'a': 1, 'b':2, 'c':3 } y = dict(a=1, b=2, c=3) 

आदि।

मैंने https://pypi.pythth.org/pypi/ruamel.ordereddict/ से ordereddict लागू किया है और मुख्य अजगर कोड में वापस विलय कर दिया है।

यदि आप अजगर दुभाषिया का पुन: निर्माण नहीं कर रहे हैं, तो यहां पायथन 2.7.8 के लिए एक पैच है: https://github.com/fwyzard/cpython/compare/2.7.8…ordereddict-2.7.8.diff ए

अगर आप जो तलाश कर रहे हैं वह आसानी से उपयोग करने के लिए प्रारंभिक सिंटैक्स प्राप्त करने का एक तरीका है – ऑर्डर किए गए आदेश का एक उपवर्ग बनाने और उस पर ऑपरेटर को जोड़ने पर विचार करें, उदाहरण के लिए,

 from collections import OrderedDict class OrderedMap(OrderedDict): def __add__(self,other): self.update(other) return self d = OrderedMap()+{1:2}+{4:3}+{"key":"value"} 

डी होगा- ऑर्डर किए गए मानचित्र ([(1, 2), (4, 3), ('कुंजी', 'मान')])


स्लाइसिंग सिंटैक्स का उपयोग करते हुए एक अन्य संभव वाक्यविन्यास-शर्करा उदाहरण:

 class OrderedMap(OrderedDict): def __getitem__(self, index): if isinstance(index, slice): self[index.start] = index.stop return self else: return OrderedDict.__getitem__(self, index) d = OrderedMap()[1:2][6:4][4:7]["a":"H"] 

अजगर 3.6 के अनुसार, सभी शब्दकोशों का डिफ़ॉल्ट रूप से आदेश दिया जाएगा । अभी के लिए, यह एक कार्यान्वयन के बारे में dict विवरण है और इस पर निर्भर नहीं होना चाहिए, लेकिन यह v3.6 के बाद मानक बन जाएगा।

प्रविष्टि आदेश हमेशा नए dict कार्यान्वयन में संरक्षित होता है:

 >>>x = {'a': 1, 'b':2, 'c':3 } >>>list(x.keys()) ['a', 'b', 'c'] 

अजगर 3.6 **kwargs क़्वॉर्ज़ ऑर्डर [पीईपी 468] और क्लास एट्रीब्यूट ऑर्डर [ पीईपी 520 ] के रूप में संरक्षित हैं। नए कॉम्पैक्ट, ऑर्डर करने वाले शब्दकोष कार्यान्वयन इन दोनों के लिए आदेश को लागू करने के लिए उपयोग किया जाता है।