मैं एक डिफाल्ट कैसे बदल सकता हूं
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
एक सामान्य तानाशाह बनना
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
मैं एक डिफाल्ट कैसे बदल सकता हूं
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
एक सामान्य तानाशाह बनना
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
जवाबों:
आप बस कॉल कर सकते हैं dict
:
>>> a
defaultdict(<type 'list'>, {'1': ['b', 'a'], '3': ['b'], '2': ['a']})
>>> dict(a)
{'1': ['b', 'a'], '3': ['b'], '2': ['a']}
लेकिन याद रखें कि एक डिफ़ॉल्ट एक तानाशाही है :
>>> isinstance(a, dict)
True
थोड़े अलग व्यवहार के साथ, इसमें जब आप एक कुंजी को एक्सेस करने की कोशिश करते हैं जो गायब है - जो आमतौर पर एक KeyError
- एक को बढ़ाएगा - default_factory
बजाय इसे कॉल किया जाता है:
>>> a.default_factory
<type 'list'>
print a
डिक्शनरी का डेटा साइड दिखाई देने से पहले आप यही देखते हैं ।
तो वास्तव में एक नई वस्तु बनाने के बिना अधिक तानाशाही व्यवहार वापस पाने के लिए एक और चाल को रीसेट करना है default_factory
:
>>> a.default_factory = None
>>> a[4].append(10)
Traceback (most recent call last):
File "<ipython-input-6-0721ca19bee1>", line 1, in <module>
a[4].append(10)
KeyError: 4
लेकिन ज्यादातर समय यह परेशानी के लायक नहीं होता है।
default_factory
? मुझे अभी कोई सुराग नहीं है कि क्या चल रहा है। माफ़ करना।
default_factory
- यह वह फ़ंक्शन है जिसे आपने पास किया है जब आपने defaultdict
पहली जगह में बनाया था , जैसे defaultdict(int)
या defaultdict(list)
। जब भी आप शब्दकोश में एक कुंजी को देखने की कोशिश करते हैं, जैसे a['3']
, उदाहरण के लिए, एक सामान्य शब्दकोश में या तो आपको मूल्य मिलता है या यह एक KeyError
अपवाद उठाता है (एक त्रुटि की तरह, आपको बता रहा है कि यह उस कुंजी को नहीं खोज सका)। लेकिन एक में defaultdict
, यह आपके लिए एक नया डिफ़ॉल्ट मान बनाने के लिए default_factory
फ़ंक्शन को कॉल करता है (यह "डिफ़ॉल्ट" है ) आपके लिए। defaultdict
pickle
(एक फ़ाइल के लिए अजगर वस्तुओं को बचाने के लिए) कई परिस्थितियोंdefaultdict
में एस नहीं संभाल सकता है ।
यदि आपका डिफ़ॉल्ट निर्णय उदाहरण के लिए पुनरावर्ती है, तो:
from collections import defaultdict
recurddict = lambda: defaultdict(recurddict)
data = recurddict()
data["hello"] = "world"
data["good"]["day"] = True
अभी तक डिफाल्ड डिक्टेड को डिक्टेड में बदलने का एक और सरल तरीका json
मॉड्यूल का उपयोग करना है
import json
data = json.loads(json.dumps(data))
और निश्चित रूप से, आपके डिफ़ॉल्ट में संतुष्ट सामग्री को समर्थित डेटा प्रकारों को सीमित करने की आवश्यकता होती है, लेकिन यह तब समस्या नहीं होनी चाहिए जब आप वर्ग या कार्यों को स्टोर करने का इरादा नहीं रखते हैं।
तुम भी एक पुनरावर्ती परिवर्तित करने के लिए एक पुनरावर्ती संस्करण चाहते हैं defaultdict
एक करने के लिए dict
आप निम्न कोशिश कर सकते हैं:
#! /usr/bin/env python3
from collections import defaultdict
def ddict():
return defaultdict(ddict)
def ddict2dict(d):
for k, v in d.items():
if isinstance(v, dict):
d[k] = ddict2dict(v)
return dict(d)
myddict = ddict()
myddict["a"]["b"]["c"] = "value"
print(myddict)
mydict = ddict2dict(myddict)
print(mydict)
defaultdict(lambda: defaultdict(int))
): {k: dict(v) for k, v in foo.items()}
dict(number_to_letter)