পাইথন: ডিফল্টডিক্টকে ডিকে রূপান্তর করুন


90

আমি কীভাবে একটি ডিফল্টডিক্টকে রূপান্তর করতে পারি

number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})

একটি সাধারণ ডিক হতে?

{'2': ['a'], '3': ['b'], '1': ['b', 'a']}

10
dict(number_to_letter)
টিম পিটার্স

4
@ টিমপিটারগুলি যেহেতু এটি প্রকৃতপক্ষে একটি সুস্পষ্ট লিখিত প্রশ্ন, একটি স্পষ্ট শিরোনাম সহ (এবং অনুসন্ধানগুলিতে সহজেই প্রদর্শিত হওয়া উচিত), ভবিষ্যতের রেফারেন্সের জন্য এটি উত্তর হিসাবে দেওয়া উচিত যদি আমরা কোনও ডুপ খুঁজে না পাই তবে এটি আরও ভাল .. ।
জন ক্লিমেটস

এই উত্তরটি সাহায্য করা উচিত: stackoverflow.com/a/3031915/1628832
karthikr

4
@ জোনক্রিমেন্টস, ভালো কথা, তবে ডিএসএম ইতিমধ্যে করেছে - আমি আশা করি তার উত্তরটি গৃহীত হয়েছে :-)
টিম পিটারস

4
@ টিমপিটারগুলি 10 কে বিটিডব্লিউতে একত্রিত হয়েছেন ... আমার মনে হয়েছিল যে এটি আপনাকে বেশি সময় লাগবে না - আপনার (নির্লজ্জ প্লাগ) চ্যাট.স্ট্যাকওভারফ্লো / রুমস / / / প্যাথনের মাধ্যমে পপ করা উচিত :)
জোন

উত্তর:


121

আপনি কেবল কল করতে পারেন 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করবেন সে সম্পর্কে আরও ব্যাখ্যা করতে পারেন ? কী চলছে তা নিয়ে আমার এখন পর্যন্ত কোনও ক্লু নেই। দুঃখিত
ব্যবহারকারী 2988464

আর কী কী আছে?
ব্যবহারকারী 2988464

4
@ ইউজার ২৮৮৪৪64৪: আপনি ইতিমধ্যে ব্যবহার করেছেন default_factory- defaultdictএটি প্রথম স্থানে তৈরি করার সময় আপনি তৈরি করেছিলেন এমন ফাংশন যা আপনি পছন্দ করেন defaultdict(int)বা করেন defaultdict(list)। আপনি যখনই অভিধানে কোনও কীটি দেখার চেষ্টা করবেন, যেমন a['3'], উদাহরণস্বরূপ, একটি সাধারণ অভিধানে আপনি হয় মান পেয়ে যান বা এটি একটি KeyErrorব্যতিক্রম উত্থাপন করে (একটি ত্রুটির মতো, আপনাকে বলে যে এটি কীটি খুঁজে পায় না)। তবে defaultdictএকটিতে, এটি পরিবর্তে default_factoryআপনার জন্য নতুন ডিফল্ট মান (এটি "ডিফল্ট" defaultdict) করতে ফাংশনটিকে কল করে ।
ডিএসএম

4
জ্যাঙ্গোর .items টেম্পলেট সম্পত্তি ডিফল্টডিক্ট্টের সাথে কাজ করবে না তা উল্লেখ করা সহায়ক! এই কারণেই আমি এখানে শেষ করেছি! সুতরাং রূপান্তরটির একটি ভাল কারণ রয়েছে
বেন

4
এছাড়াও মনে রাখবেন সহায়ক যে pickleনারা হাতল (একটি ফাইলে পাইথন বস্তু সংরক্ষণ করার জন্য) defaultdictমধ্যে গুলি অনেক পরিস্থিতিতে
drevicko

28

যদি আপনার ডিফল্টডিক্ট্টটি পুনরাবৃত্তভাবে সংজ্ঞায়িত করা হয়, উদাহরণস্বরূপ:

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))

এবং অবশ্যই, আপনার ডিফল্টডিক্ট্টে সন্তুষ্ট মানগুলি জসন সমর্থিত ডেটা টাইপের মধ্যে সীমাবদ্ধ থাকা দরকার, তবে আপনি যদি ডিকটিতে ক্লাস বা ফাংশন সংরক্ষণ করার ইচ্ছা না করেন তবে সমস্যা হবে না।


8
ভাল ধারণা, খুব খারাপ আমার ডেটা JSON- এ সিরিয়ালায়িত হবে না: * (
কাসাপো

15

আপনি এমনকি একটি 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)

আমার যা প্রয়োজন তা-ই! দুর্ভাগ্যক্রমে, আমার ডিফল্টডিক্ট্টে এমন কিছু কী রয়েছে যা কাস্টম এনকোডার ছাড়া JSON সিরিয়ালযোগ্য নয় (কীগুলি টিপলস হয় - আমার পছন্দ নয়, কেবল আমার সমস্যা)
কাসাপো

ভাল একটা. অভিধান বোধগম্যতা ব্যবহার করা সুসংহত হয় যদি এটি কেবলমাত্র দুটি স্তর গভীর (যেমন defaultdict(lambda: defaultdict(int))): {k: dict(v) for k, v in foo.items()}
ggorlen
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.