আমি কীভাবে একটি ডিফল্টডিক্টকে রূপান্তর করতে পারি
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))
এবং অবশ্যই, আপনার ডিফল্টডিক্ট্টে সন্তুষ্ট মানগুলি জসন সমর্থিত ডেটা টাইপের মধ্যে সীমাবদ্ধ থাকা দরকার, তবে আপনি যদি ডিকটিতে ক্লাস বা ফাংশন সংরক্ষণ করার ইচ্ছা না করেন তবে সমস্যা হবে না।
আপনি এমনকি একটি recursive রূপান্তরের জন্য একটি recursive সংস্করণ চান 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)