दिलचस्प पोस्ट
कैसे WinInet एपीआई का उपयोग कर डेल्फी में एक HTTP पोस्ट अनुरोध भेजने के लिए एक स्थैतिक constexpr चर की आत्म-प्रारंभ, क्या यह अच्छी तरह से बनाई गई है? jQuery: ऊंचाई () / चौड़ाई () और "प्रदर्शन: कोई नहीं" एकाधिक मूल्यों को एक बार में दोबारा प्रस्तुत करना Jquery में बटन पाठ टॉगल जीआईटी को एचटीटीपी / एचटीएमएल के साथ रिमोट रिपॉजिटरी में नहीं लाया जा सकता सी ++ 11 ने एक मानकीकृत स्मृति मॉडल पेश किया इसका क्या मतलब है? और यह C ++ प्रोग्रामिंग को प्रभावित करने वाला है? चरित्र सेट और मिलान का मतलब क्या है? ग्राफ़ ऑटो-लेआउट एल्गोरिथम Enum वर्ग क्यों सादे enum से अधिक पसंद है? जावास्क्रिप्ट में वस्तुओं की एक सरणी में एक मान खोजें समानता के लिए छवियों की तुलना करने के लिए सरल और तेज़ तरीका ListView में छवियों के आलसी लोड 2.0 एएसएमएक्स वेब सेवा से JSON को वापस कैसे करें क्या इस साधारण 'डबल' गणना के साथ गलत है?

क्या मैं पायथन में एक आदेश दिया, डिफ़ॉल्ट शब्द बना सकता हूँ?

मैं एक ऑब्जेक्ट में collections से OrderedDict() और defaultdict() OrderedDict() को जोड़ना OrderedDict() , जो कि एक ऑर्डर, डिफॉल्ट defaultdict() होगा क्या यह संभव है?

Solutions Collecting From Web of "क्या मैं पायथन में एक आदेश दिया, डिफ़ॉल्ट शब्द बना सकता हूँ?"

निम्नलिखित ( इस नुस्खा के संशोधित संस्करण का उपयोग करते हुए) मेरे लिए काम करता है:

 from collections import OrderedDict, Callable class DefaultOrderedDict(OrderedDict): # Source: http://stackoverflow.com/a/6190500/562769 def __init__(self, default_factory=None, *a, **kw): if (default_factory is not None and not isinstance(default_factory, Callable)): raise TypeError('first argument must be callable') OrderedDict.__init__(self, *a, **kw) self.default_factory = default_factory def __getitem__(self, key): try: return OrderedDict.__getitem__(self, key) except KeyError: return self.__missing__(key) def __missing__(self, key): if self.default_factory is None: raise KeyError(key) self[key] = value = self.default_factory() return value def __reduce__(self): if self.default_factory is None: args = tuple() else: args = self.default_factory, return type(self), args, None, None, self.items() def copy(self): return self.__copy__() def __copy__(self): return type(self)(self.default_factory, self) def __deepcopy__(self, memo): import copy return type(self)(self.default_factory, copy.deepcopy(self.items())) def __repr__(self): return 'OrderedDefaultDict(%s, %s)' % (self.default_factory, OrderedDict.__repr__(self)) 

यहां एक और संभावना है, जो रेमंड हैटिंगर के सुपर () विचारित सुपर से प्रेरित है, जिसे पायथन 2.7.एक्स और 3.4.X पर परीक्षण किया गया है:

 from collections import OrderedDict, defaultdict class OrderedDefaultDict(OrderedDict, defaultdict): def __init__(self, default_factory=None, *args, **kwargs): #in python3 you can omit the args to super super(OrderedDefaultDict, self).__init__(*args, **kwargs) self.default_factory = default_factory 

यदि आप वर्ग के एमआरओ (उर्फ, help(OrderedDefaultDict) ) की जांच करते हैं, तो आप यह देखेंगे:

 class OrderedDefaultDict(collections.OrderedDict, collections.defaultdict) | Method resolution order: | OrderedDefaultDict | collections.OrderedDict | collections.defaultdict | __builtin__.dict | __builtin__.object 

जिसका अर्थ है कि जब OrderedDefaultDict का एक उदाहरण आरंभ किया गया है, यह OrderedDict के init को OrderedDict , लेकिन यह एक बदले में __builtin__.dict कॉल करने से पहले __builtin__.dict विधियों को कॉल __builtin__.dict , जो ठीक उसी प्रकार हम चाहते हैं।

इस बारे में सोचने के लिए यहां एक और उपाय है कि क्या आपके उपयोग का मामला मेरी तरह सरल है और आप अपने कोड के लिए DefaultOrderedDict वर्ग कार्यान्वयन की जटिलता को जोड़ना नहीं चाहते हैं।

 from collections import OrderedDict keys = ['a', 'b', 'c'] items = [(key, None) for key in keys] od = OrderedDict(items) 

( None मेरी इच्छित डिफ़ॉल्ट मान None है।)

ध्यान दें कि यह समाधान काम नहीं करेगा यदि आपकी एक आवश्यकता गतिशील रूप से नई मूल्य को डिफ़ॉल्ट मान के साथ सम्मिलित करना है। सादगी का एक समझौता

अपडेट 3/13/17 – मुझे इस उपयोग के मामले के लिए सुविधा फ़ंक्शन का पता चला। उपर्युक्त के समान है लेकिन आप पंक्ति items = ... और बस छोड़ सकते हैं:

 od = OrderedDict.fromkeys(keys) 

आउटपुट:

 OrderedDict([('a', None), ('b', None), ('c', None)]) 

और अगर आपकी चाबियाँ एकल अक्षर हैं, तो आप बस एक स्ट्रिंग पार कर सकते हैं:

 OrderedDict.fromkeys('abc') 

इसके ऊपर दो उदाहरणों के समान ही आउटपुट है

आप ऑर्डर्डडिक्ट.फ्रेमकीज़ के दूसरे एआरजी के रूप में एक डिफ़ॉल्ट मान दे सकते हैं।

यदि आप एक साधारण समाधान चाहते हैं जिसके लिए क्लास की आवश्यकता नहीं है, तो आप बस OrderedDict. setdefault ( key, default=None ) उपयोग कर सकते हैं OrderedDict. setdefault ( key, default=None ) OrderedDict. setdefault ( key, default=None ) या OrderedDict. get ( key, default=None ) OrderedDict. get ( key, default=None ) । यदि आप केवल कुछ जगहों से प्राप्त / सेट करते हैं, तो एक पाश में कहते हैं, आप आसानी से सेट अप कर सकते हैं

 totals = collections.OrderedDict() for i, x in some_generator(): totals[i] = totals.get(i, 0) + x 

यह setdefault साथ सूचियों के लिए भी आसान है:

 agglomerate = collections.OrderedDict() for i, x in some_generator(): agglomerate.setdefault(i, []).append(x) 

लेकिन यदि आप इसे कुछ बार से ज्यादा उपयोग करते हैं, तो शायद एक कक्षा स्थापित करना बेहतर होता है, जैसे अन्य उत्तरों में।

@जेके के जवाब का एक सरल संस्करण है:

 from collections import OrderedDict class OrderedDefaultListDict(OrderedDict): #name according to default def __missing__(self, key): self[key] = value = [] #change to whatever default you want return value