কীভাবে সুন্দর নেস্টেড অভিধানগুলি মুদ্রণ করবেন?


289

পাইথনে আমি কীভাবে 4 ডলার গভীরতার সাথে একটি অভিধান মুদ্রণ করতে পারি? আমি সুন্দর মুদ্রণের চেষ্টা করেছিpprint() , কিন্তু এটি কার্যকর হয়নি:

import pprint 
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(mydict)

আমি কেবল একটি ইন্ডেন্টেশন চাই ("\t" প্রতিটি বাসা বাঁধার জন্য ) , যাতে আমি এরকম কিছু পাই:

key1
    value1
    value2
    key2
       value1
       value2

প্রভৃতি

কিভাবে আমি এটি করতে পারব?


29
"কাজ হয়নি" এর অর্থ কী? কীভাবে "প্রিন্ট" কাজ করে না "খুব দয়া করে নির্দিষ্ট করে দিন।
এস .লট

5
আমি এখন এই উত্তরগুলির মধ্যে তিনটি ব্যবহার করেছি (প্রতিটি নির্দিষ্ট দৃশ্যে ভাল ): @ কেনের জসন উত্তরটি ভাল তবে কখনও কখনও ব্যর্থ হয় যখন বস্তুটি জসন সিরিয়ালযোগ্য হতে পারে না (ব্যতিক্রম ছোঁড়ে)। যদি @ কেনের জসন উত্তরটি কাজ না করে তবে অ্যান্ডির ইয়ামাল উত্তরটি চেষ্টা করে দেখুন এবং এটি কাজ করা উচিত তবে স্ট্রিং আউটপুটটি মানুষের পাঠযোগ্য কিছুটা কম। [@ টিএইচএইচ এর উত্তর] সর্বাধিক জেনেরিক (কোনও বস্তুর পক্ষে কাজ করা উচিত এবং কোনও লিবিস ব্যবহার করা উচিত নয়)।
ট্রেভর বয়েড স্মিথ

উত্তর:


143

আপনি ঠিক কীভাবে ফর্ম্যাটটি দেখতে চান তা আমি নিশ্চিত নই তবে আপনি এই জাতীয় কোনও ফাংশন দিয়ে শুরু করতে পারেন:

def pretty(d, indent=0):
   for key, value in d.items():
      print('\t' * indent + str(key))
      if isinstance(value, dict):
         pretty(value, indent+1)
      else:
         print('\t' * (indent+1) + str(value))

8
আপনি জানেন @ কেনের প্রচলিত উত্তর এর চেয়ে আরও ভাল। জেসন ইতিমধ্যে সমস্ত কিছু পরিচালনা করে এবং এর ফলে ত্রুটিগুলি এড়াতে পারে
আশ্চর্যজনকভাবে

আমি এটিকে আমার সমাধানের নেস্টেড ডিকের সাথে কাজ করতে পারি না, কারণ এটি আমাকে একটি ইউনিকোড এনকোডেরর দিয়েছে, এটি ডিক কীটিও প্রিন্ট করে না, তালিকার ভিতরে এবং টিপলসগুলিতে যাবে না এবং পাইথনের বৈধ বাক্য গঠন রাখবে না।
y.petremann

এই উত্তরটি আমার কাছে মনোমুগ্ধের মতো কাজ করেছিল, তবে আমি একটি নতুন প্রশ্ন পোস্ট করেছি stackoverflow.com/questions/36972225/… যা কতগুলি মান মুদ্রণ করা উচিত তার সীমা নির্ধারণ করে।
gsamaras

বেশ ভাল. যদি আপনি ওপি-র প্রশ্নের মতো নেস্টেড তালিকা পেয়ে থাকেন তবে আপনাকে এর জন্য কিছু হ্যান্ডলিং যুক্ত করতে হবে। আপনি যদি পাই 2 তে সমস্যা বোধ করছেন তবে এর কারণ হ্যাক ছাড়া এটি ইউনিকোডটি সঠিকভাবে পরিচালনা করতে পারে না __future__বলে উত্তরের উত্তর এখন উল্লেখ করেছে, তাই আপনাকে যেখানে প্রয়োজন সেখানে নিয়োগ করতে হবে (বা ইতিমধ্যে 3 এ আপডেট করা হবে)।
sudo

এটি আমার পক্ষে যথেষ্ট কাজ করেছে: python def pretty(d, indent=0): for key, value in d.items(): if isinstance(value, dict): print(' ' * indent + str(key)) pretty(value, indent+1) else: print(' ' * (indent+1) + f"{key}: {value}")
hum3

500

আমার প্রথম চিন্তা ছিল যে জেএসওএন সিরিয়ালাইজার সম্ভবত নেস্টেড ডিকশনারিগুলিতে খুব ভাল, তাই আমি প্রতারণা করব এবং এটি ব্যবহার করব:

>>> import json
>>> print json.dumps({'a':2, 'b':{'x':3, 'y':{'t1': 4, 't2':5}}},
...                  sort_keys=True, indent=4)
{
    "a": 2,
    "b": {
        "x": 3,
        "y": {
            "t1": 4,
            "t2": 5
        }
    }
}

41
এটি দুর্দান্ত, তবে সমস্ত অভিধান ভালভাবে মুদ্রণ করে না। json.dumps মুদ্রণ (myObject .__ dict__, sort_keys = true, ইন্ডেন্ট = 4) #TypeError: <0x0000000002E6A748 এ বস্তু> তাদেরকে JSON serializable নয়
tponthieux

4
এটি কার্যকর দেখায়, এটি আউটপুটটি ওপি যা চায় তা নয়।
মার্টিনো

2
@ মার্টিনেউ: ওপি-র অনুরোধিত আউটপুটটি কোনও অর্থবোধ করে না, অভিধানে প্রতিটি মানের জন্য কী প্রয়োজন।
nnot101

2
@ নান্ট 101: একটি সুন্দর প্রিন্টার পছন্দসই আউটপুট উত্পাদন করতে যা করতে পারে তা করতে পারে।
মার্টিনো

22
জসন.ডম্পস একটি anচ্ছিক আর্গুমেন্ট হিসাবে রূপান্তর ফাংশন গ্রহণ করে, তাই json.dumps (myObject .__ আদেশ__, সাজ্ট_কিজ = সত্য, ইন্ডেন্ট = 4, ডিফল্ট = স্ট্র) আপনি নিজেরাই মুদ্রণ করতে এবং বৃত্তাকার হয়ে উঠতে কমপক্ষে repr এর একটি অবজেক্ট বাস্তবায়ন ব্যবহার করতে পারেন 'JSON সিরিয়ালযোগ্য নয়'
টাইপ এরির

56

আপনি চেষ্টা করে দেখতে পারেন YAML মাধ্যমে PyYAML । এর আউটপুটটি সূক্ষ্ম-সুর করা যেতে পারে। আমি নিম্নলিখিতটি দিয়ে শুরু করার পরামর্শ দেব:

print yaml.dump(data, allow_unicode=True, default_flow_style=False)

ফলাফল খুব পাঠযোগ্য; এটি প্রয়োজনে পাইথনকে আবারও পার্স করা যায়।

সম্পাদনা:

উদাহরণ:

>>> import yaml
>>> data = {'a':2, 'b':{'x':3, 'y':{'t1': 4, 't2':5}}}
>>> print yaml.dump(data, default_flow_style=False)
a: 2
b:
  x: 3
  y:
    t1: 4
    t2: 5

1
ইয়ামল ব্যবহার করা অত্যন্ত আকর্ষণীয় কারণ এটি তার ফর্ম্যাটের উপরে ডেটা টাইপ রাখে, কেবলমাত্র আমি এর বিরুদ্ধে বলতে পারি এটি বৈধ অজগর স্ট্রিং উত্পাদন করে না, তবে প্রায় অজগরে রূপান্তরিত হতে পারে।
y.petremann

1
ইয়ামল ন্যাম্পির স্কেলার ধরণের সংস্করণ পছন্দ করে না ... আমি অবাক হইনি যে নম্পি অ্যারেগুলি সমর্থন করে না, তবে আমি floatএবং এ-এর জন্য একই আউটপুটটি আশা numpy.float64
করতাম

এই পদ্ধতিটি অভিধানের একটি তালিকা ব্যবহার করে আমার জন্যও কাজ করেছিল
গ্রান্ট শ্যানন

36

যা করা হয়েছে তা হিসাবে, আমি এমন কোনও প্রিন্টার দেখতে পাচ্ছি না যা অন্তত খুব সাধারণ বিন্যাসের সাথে পাইথন ইন্টারপ্রেটারের আউটপুটকে নকল করে তাই এখানে আমার:

class Formatter(object):
    def __init__(self):
        self.types = {}
        self.htchar = '\t'
        self.lfchar = '\n'
        self.indent = 0
        self.set_formater(object, self.__class__.format_object)
        self.set_formater(dict, self.__class__.format_dict)
        self.set_formater(list, self.__class__.format_list)
        self.set_formater(tuple, self.__class__.format_tuple)

    def set_formater(self, obj, callback):
        self.types[obj] = callback

    def __call__(self, value, **args):
        for key in args:
            setattr(self, key, args[key])
        formater = self.types[type(value) if type(value) in self.types else object]
        return formater(self, value, self.indent)

    def format_object(self, value, indent):
        return repr(value)

    def format_dict(self, value, indent):
        items = [
            self.lfchar + self.htchar * (indent + 1) + repr(key) + ': ' +
            (self.types[type(value[key]) if type(value[key]) in self.types else object])(self, value[key], indent + 1)
            for key in value
        ]
        return '{%s}' % (','.join(items) + self.lfchar + self.htchar * indent)

    def format_list(self, value, indent):
        items = [
            self.lfchar + self.htchar * (indent + 1) + (self.types[type(item) if type(item) in self.types else object])(self, item, indent + 1)
            for item in value
        ]
        return '[%s]' % (','.join(items) + self.lfchar + self.htchar * indent)

    def format_tuple(self, value, indent):
        items = [
            self.lfchar + self.htchar * (indent + 1) + (self.types[type(item) if type(item) in self.types else object])(self, item, indent + 1)
            for item in value
        ]
        return '(%s)' % (','.join(items) + self.lfchar + self.htchar * indent)

এটি আরম্ভ করার জন্য:

pretty = Formatter()

এটি সংজ্ঞায়িত ধরণের জন্য বিন্যাস সংযোজনকে সমর্থন করতে পারে, আপনাকে কেবল এই জাতীয়টির জন্য একটি ফাংশন তৈরি করতে হবে এবং সেট_ফর্মটারের সাথে এটি টাইপ করতে হবে যা আপনি পছন্দ করতে পারেন:

from collections import OrderedDict

def format_ordereddict(self, value, indent):
    items = [
        self.lfchar + self.htchar * (indent + 1) +
        "(" + repr(key) + ', ' + (self.types[
            type(value[key]) if type(value[key]) in self.types else object
        ])(self, value[key], indent + 1) + ")"
        for key in value
    ]
    return 'OrderedDict([%s])' % (','.join(items) +
           self.lfchar + self.htchar * indent)
pretty.set_formater(OrderedDict, format_ordereddict)

Reasonsতিহাসিক কারণে, আমি পূর্ববর্তী সুন্দর প্রিন্টারটি রাখি যা ক্লাসের পরিবর্তে একটি ফাংশন ছিল, তবে সেগুলি উভয়ই একইভাবে ব্যবহার করা যেতে পারে, শ্রেণি সংস্করণটি আরও অনেক বেশি অনুমতি দেয়:

def pretty(value, htchar='\t', lfchar='\n', indent=0):
    nlch = lfchar + htchar * (indent + 1)
    if type(value) is dict:
        items = [
            nlch + repr(key) + ': ' + pretty(value[key], htchar, lfchar, indent + 1)
            for key in value
        ]
        return '{%s}' % (','.join(items) + lfchar + htchar * indent)
    elif type(value) is list:
        items = [
            nlch + pretty(item, htchar, lfchar, indent + 1)
            for item in value
        ]
        return '[%s]' % (','.join(items) + lfchar + htchar * indent)
    elif type(value) is tuple:
        items = [
            nlch + pretty(item, htchar, lfchar, indent + 1)
            for item in value
        ]
        return '(%s)' % (','.join(items) + lfchar + htchar * indent)
    else:
        return repr(value)

এটি ব্যবহার করতে:

>>> a = {'list':['a','b',1,2],'dict':{'a':1,2:'b'},'tuple':('a','b',1,2),'function':pretty,'unicode':u'\xa7',("tuple","key"):"valid"}
>>> a
{'function': <function pretty at 0x7fdf555809b0>, 'tuple': ('a', 'b', 1, 2), 'list': ['a', 'b', 1, 2], 'dict': {'a': 1, 2: 'b'}, 'unicode': u'\xa7', ('tuple', 'key'): 'valid'}
>>> print(pretty(a))
{
    'function': <function pretty at 0x7fdf555809b0>,
    'tuple': (
        'a',
        'b',
        1,
        2
    ),
    'list': [
        'a',
        'b',
        1,
        2
    ],
    'dict': {
        'a': 1,
        2: 'b'
    },
    'unicode': u'\xa7',
    ('tuple', 'key'): 'valid'
}

অন্যান্য সংস্করণের তুলনায়:

  • এই সমাধানটি সরাসরি অবজেক্টের ধরণের জন্য দেখায়, তাই আপনি প্রায় সমস্ত কিছু মুদ্রণ করতে পারেন, কেবল তালিকা বা ডিক নয়।
  • কোন নির্ভরতা নেই।
  • সবকিছু একটি স্ট্রিংয়ের ভিতরে রাখা হয়, যাতে আপনি এটি দিয়ে যা করতে পারেন তা করতে পারেন।
  • ক্লাস এবং ফাংশনটি পরীক্ষা করা হয়েছে এবং পাইথন ২.7 এবং ৩.৪ এর সাথে কাজ করে।
  • আপনার ভিতরে সমস্ত ধরণের অবজেক্ট থাকতে পারে, এটি তাদের উপস্থাপনা এবং ফলাফলগুলির মধ্যে দেওয়া সামগ্রীর মতো নয় (সুতরাং স্ট্রিংয়ের উদ্ধৃতি রয়েছে, ইউনিকোড স্ট্রিং সম্পূর্ণরূপে উপস্থাপিত ...)।
  • শ্রেণীর সংস্করণ সহ, আপনি आफूले চাইলে প্রতিটি বস্তুর জন্য ফর্ম্যাটিং যুক্ত করতে বা ইতিমধ্যে সংজ্ঞায়িতগুলির জন্য এগুলি পরিবর্তন করতে পারেন।
  • কী কোনও বৈধ প্রকারের হতে পারে।
  • আমাদের পছন্দ মতো প্রতিটি জিনিসের জন্য ইনডেন্ট এবং নিউলাইন চরিত্রটি পরিবর্তন করা যেতে পারে।
  • ডিক্ট, তালিকা এবং টিপলসগুলি বেশ মুদ্রিত।

2
এটি অবশ্যই গ্রহণযোগ্য সমাধান হওয়া উচিত - জেএসএনের উপর নির্ভরতার অভাব বিশাল।
জোশ

এটি দুর্দান্ত হবে যদি এটি বস্তুগুলিকে ডিক্টে রূপান্তর করে এবং তাদের কীটি অবজেক্টের ধরণের হিসাবে সেট করে ফেলতে পারে
অ্যালেক্স কোরি

এটি করার জন্য আপনি মূলত বিন্যাস_অবজ্যাক্ট পদ্ধতিটি ইন্টার্নালি বা এক্সটার্নালি প্রতিস্থাপন করতে পারেন।
y.petremann

সেট_ফর্ম্টার - দুটি টি দরকার, এটি একটি টাইপো, ফর্ম্যাটর হওয়া উচিত
নিকোলে প্রকোপায়েভ

32

এইভাবে আপনি প্রিন্ট করে আপনার মুদ্রণযন্ত্রের নাম ইয়াসিন প্রিন্ট করতে পারেন

import json

print (json.dumps(yasin, indent=2))

5
এটি ধরে নিয়েছে অভিধানের বিষয়বস্তুটি হ'ল জসন সিরিয়ালাইজ-সক্ষম, যা অগত্যা সত্য নয়।
স্পাইসেল

8

এর সাথে অন্য একটি বিকল্প yapf:

from pprint import pformat
from yapf.yapflib.yapf_api import FormatCode

dict_example = {'1': '1', '2': '2', '3': [1, 2, 3, 4, 5], '4': {'1': '1', '2': '2', '3': [1, 2, 3, 4, 5]}}
dict_string = pformat(dict_example)
formatted_code, _ = FormatCode(dict_string)

print(formatted_code)

আউটপুট:

{
    '1': '1',
    '2': '2',
    '3': [1, 2, 3, 4, 5],
    '4': {
        '1': '1',
        '2': '2',
        '3': [1, 2, 3, 4, 5]
    }
}

5

অন্যরা যেমন পোস্ট করেছে, আপনি নেস্টেড ডিকশনারি ডেটা মুদ্রণ করতে পুনরাবৃত্তি / ডিএফএস ব্যবহার করতে পারেন এবং এটি যদি অভিধান হয় তবে পুনরাবৃত্তভাবে কল করতে পারেন; অন্যথায় তথ্য মুদ্রণ করুন।

def print_json(data):
    if type(data) == dict:
            for k, v in data.items():
                    print k
                    print_json(v)
    else:
            print data

5

এর জন্য একটি অজগর উপায়গুলির মধ্যে একটি হ'ল ইতিমধ্যে বিল্ড পিপ্রিন্ট মডিউলটি ব্যবহার করা।

মুদ্রণের গভীরতা নির্ধারণ করার জন্য আপনার যে যুক্তিটি প্রয়োজন তা হ'ল আপনি প্রত্যাশা করতে পারেন depth

import pprint
pp = pprint.PrettyPrinter(depth=4)
pp.pprint(mydict)

এটাই !


4

পাউত আপনি এটি নিক্ষেপ করা সুন্দর কিছু মুদ্রণ করতে পারে, উদাহরণস্বরূপ ( dataঅন্য উত্তর থেকে ধার করা):

data = {'a':2, 'b':{'x':3, 'y':{'t1': 4, 't2':5}}}
pout.vs(data)

স্ক্রিনে মুদ্রিত আউটপুট এর ফলাফল হবে:

{
    'a': 2,
    'b':
    {
        'y':
        {
            't2': 5,
            't1': 4
        },
        'x': 3
    }
}

অথবা আপনি আপনার বস্তুর ফর্ম্যাট স্ট্রিং আউটপুট ফিরিয়ে দিতে পারেন:

v = pout.s(data)

এটির প্রাথমিক ব্যবহারের ক্ষেত্রটি ডিবাগিংয়ের জন্য যাতে এটি কোনও বস্তুর উদাহরণ বা কোনও কিছুতে দম বন্ধ করে না এবং এটি ইউনিকোড আউটপুট পরিচালনা করে যেমনটি আপনি প্রত্যাশা করেন, অজগর ২. 3 এবং ৩ এ কাজ করে।

প্রকাশ : আমি পাট লেখক এবং রক্ষণাবেক্ষণকারী।


3

আমি নেচের উত্তর নিয়েছি এবং নেস্টেড ডিকশনারি এবং তালিকাগুলির আমার প্রয়োজনের জন্য এটি সামান্য সংশোধন করেছি:

def pretty(d, indent=0):
    if isinstance(d, dict):
        for key, value in d.iteritems():
            print '\t' * indent + str(key)
            if isinstance(value, dict) or isinstance(value, list):
                pretty(value, indent+1)
            else:
                print '\t' * (indent+1) + str(value)
    elif isinstance(d, list):
        for item in d:
            if isinstance(item, dict) or isinstance(item, list):
                pretty(item, indent+1)
            else:
                print '\t' * (indent+1) + str(item)
    else:
        pass

যা আমাকে এর পরে আউটপুট দেয়:

>>> 
xs:schema
    @xmlns:xs
        http://www.w3.org/2001/XMLSchema
    xs:redefine
        @schemaLocation
            base.xsd
        xs:complexType
            @name
                Extension
            xs:complexContent
                xs:restriction
                    @base
                        Extension
                    xs:sequence
                        xs:element
                            @name
                                Policy
                            @minOccurs
                                1
                            xs:complexType
                                xs:sequence
                                    xs:element
                                            ...

1

Sth, আমি ডুব যে সুন্দর;)

def pretty(d, indent=0):
    for key, value in d.iteritems():
        if isinstance(value, dict):
            print '\t' * indent + (("%30s: {\n") % str(key).upper())
            pretty(value, indent+1)
            print '\t' * indent + ' ' * 32 + ('} # end of %s #\n' % str(key).upper())
        elif isinstance(value, list):
            for val in value:
                print '\t' * indent + (("%30s: [\n") % str(key).upper())
                pretty(val, indent+1)
                print '\t' * indent + ' ' * 32 + ('] # end of %s #\n' % str(key).upper())
        else:
            print '\t' * indent + (("%30s: %s") % (str(key).upper(),str(value)))

1
-1: উদাহরণগুলি listনয় এমন মানগুলি পরিচালনা করে না dict, যেমন pretty({'key': [1, 2, 3]}, indent=4)==> AttributeError: 'int' object has no attribute 'iteritems'। আমি এটি বড় হাতের চাবি পছন্দ করি না।
মার্টিনিউ

আপনার সমাধান বিবেচনা করুন যে মূল ডিকের ভিতরে তালিকার ভিতরে কোনও ডিক থাকতে পারে না। এছাড়াও এটি বিবেচনা করে যে আমরা কোনও তালিকা বা একটি টুপলকে সুন্দরভাবে প্রিন্ট করতে চাই না। অবশেষে কীগুলি মূলধন করবেন না, {'a': 0, 'এ': 1 for এর ফলাফলটি সঠিক হবে না।
y.petremann

1
This class prints out a complex nested dictionary with sub dictionaries and sub lists.  
##
## Recursive class to parse and print complex nested dictionary
##

class NestedDictionary(object):
    def __init__(self,value):
        self.value=value

    def print(self,depth):
        spacer="--------------------"
        if type(self.value)==type(dict()):
            for kk, vv in self.value.items():
                if (type(vv)==type(dict())):
                    print(spacer[:depth],kk)
                    vvv=(NestedDictionary(vv))
                    depth=depth+3
                    vvv.print(depth)
                    depth=depth-3
                else:
                    if (type(vv)==type(list())):
                        for i in vv:
                            vvv=(NestedDictionary(i))
                            depth=depth+3
                            vvv.print(depth)
                            depth=depth-3
                    else:
                        print(spacer[:depth],kk,vv) 

##
## Instatiate and execute - this prints complex nested dictionaries
## with sub dictionaries and sub lists
## 'something' is a complex nested dictionary

MyNest=NestedDictionary(weather_com_result)
MyNest.print(0)

1

পাইথনে কোনও জসন অবজেক্টের সাধারণ কাঠামোটি মুদ্রণের জন্য আমি এই সাধারণ কোডটি লিখেছিলাম।

def getstructure(data, tab = 0):
    if type(data) is dict:
        print ' '*tab + '{' 
        for key in data:
            print ' '*tab + '  ' + key + ':'
            getstructure(data[key], tab+4)
        print ' '*tab + '}'         
    elif type(data) is list and len(data) > 0:
        print ' '*tab + '['
        getstructure(data[0], tab+4)
        print ' '*tab + '  ...'
        print ' '*tab + ']'

নিম্নলিখিত তথ্য জন্য ফলাফল

a = {'list':['a','b',1,2],'dict':{'a':1,2:'b'},'tuple':('a','b',1,2),'function':'p','unicode':u'\xa7',("tuple","key"):"valid"}
getstructure(a)

খুব কমপ্যাক্ট এবং দেখতে দেখতে:

{
  function:
  tuple:
  list:
    [
      ...
    ]
  dict:
    {
      a:
      2:
    }
  unicode:
  ('tuple', 'key'):
}

0

আমি নিজেই একটি পাইথন নবাগত আত্মীয় কিন্তু আমি গত কয়েক সপ্তাহ ধরে নেস্টেড ডিকশনারি নিয়ে কাজ করছি এবং এটিই আমি সামনে এসেছি।

আপনার স্ট্যাক ব্যবহার করার চেষ্টা করা উচিত। মূল অভিধান থেকে কীগুলি একটি তালিকার একটি তালিকা তৈরি করুন:

stack = [ root.keys() ]     # Result: [ [root keys] ]

সর্বশেষ থেকে প্রথম পর্যন্ত বিপরীতে যেতে গিয়ে, অভিধানের প্রতিটি কী-এর অনুসন্ধান (একটি) অভিধান রয়েছে কিনা তা দেখুন। যদি তা না হয় তবে কীটি মুদ্রণ করুন এবং মুছে ফেলুন। তবে যদি কীটির মান হয় একটি অভিধান, মুদ্রণ কী তারপর স্ট্যাকের শেষে যে মান জন্য কী যোগ, এবং একই ভাবে সেই তালিকাটি প্রক্রিয়াকরণের শুরু, কি প্রতিটি নতুন তালিকার জন্য যাও recursively পুনরাবৃত্তি।

প্রতিটি তালিকার দ্বিতীয় কীটির মান যদি অভিধান হয় তবে বেশ কয়েকটি রাউন্ডের পরে আপনার এমন কিছু হবে:

[['key 1','key 2'],['key 2.1','key 2.2'],['key 2.2.1','key 2.2.2'],[`etc.`]]

এই পদ্ধতির উল্টো দিকটি হ'ল ইনডেন্টটি \tস্ট্যাকের দৈর্ঘ্যের মাত্র কয়েক গুণ বেশি:

indent = "\t" * len(stack)

নেতিবাচকতাটি হ'ল প্রতিটি কীটি প্রাসঙ্গিক উপ-অভিধানে আপনাকে হ্যাশ করা দরকার তা পরীক্ষা করতে গেলেও এটি তালিকা বোধগম্যতা এবং একটি সাধারণ forলুপের সাহায্যে সহজেই পরিচালনা করা যায় :

path = [li[-1] for li in stack]
# The last key of every list of keys in the stack

sub = root
for p in path:
    sub = sub[p]


if type(sub) == dict:
    stack.append(sub.keys()) # And so on

সচেতন থাকুন যে এই পদ্ধতির জন্য আপনাকে খালি তালিকা অনুসরণ করতে হবে এবং পরে যে কোনও তালিকার সর্বশেষ কীটি মুছে ফেলতে হবে (অবশ্যই অন্য কোনও খালি তালিকা তৈরি করতে পারে) ইত্যাদি)

এই পদ্ধতির বাস্তবায়নের অন্যান্য উপায় রয়েছে তবে আশা করি এটি কীভাবে এটি করা যায় তার একটি প্রাথমিক ধারণা দেয়।

সম্পাদনা: আপনি যদি এই সমস্ত কিছুটি দেখতে না চান তবে pprintমডিউলটি একটি সুন্দর বিন্যাসে নেস্টেড ডিকশনারি মুদ্রণ করে।


0

এই স্টাথের মন্তব্যের ভিত্তিতে আমি একটি ফাংশন লিখেছি wrote এটি ইনডেন্টের সাথে জসন.ডম্পসের মতোই কাজ করে তবে আমি ইনডেন্টের জায়গার পরিবর্তে ট্যাব ব্যবহার করছি। পাইথন ৩.২++ এ আপনি সরাসরি '\ t' হতে ইন্ডেন্ট নির্দিষ্ট করতে পারবেন তবে ২.7-এ নয়।

def pretty_dict(d):
    def pretty(d, indent):
        for i, (key, value) in enumerate(d.iteritems()):
            if isinstance(value, dict):
                print '{0}"{1}": {{'.format( '\t' * indent, str(key))
                pretty(value, indent+1)
                if i == len(d)-1:
                    print '{0}}}'.format( '\t' * indent)
                else:
                    print '{0}}},'.format( '\t' * indent)
            else:
                if i == len(d)-1:
                    print '{0}"{1}": "{2}"'.format( '\t' * indent, str(key), value)
                else:
                    print '{0}"{1}": "{2}",'.format( '\t' * indent, str(key), value)
    print '{'
    pretty(d,indent=1)
    print '}'

উদা:

>>> dict_var = {'a':2, 'b':{'x':3, 'y':{'t1': 4, 't2':5}}}
>>> pretty_dict(dict_var)
{
    "a": "2",
    "b": {
        "y": {
            "t2": "5",
            "t1": "4"
        },
        "x": "3"
    }
}

আমি এটিকে আমার সমাধানের নেস্টেড ডিকের সাথে কাজ করতে পারি না, কারণ এটি আমাকে একটি ইউনিকোড এঙ্কোড এরির দিয়েছে, আইটেম এবং কীগুলিও সমস্ত স্ট্রিংয়ে রূপান্তরিত হয়েছে, যদি আমরা তালিকা বা ডিসিকস যুক্ত সংখ্যা বা টিপল ব্যবহার করি তবে কী হবে? আপনার সমাধানটি Finnaly বিবেচনায় রাখুন যে আমাদের অবজেক্টটি আমরা সুন্দর মুদ্রণ করতে চাই এটি অবশ্যই একটি ডিক হতে হবে।
y.petremann

আমি পাইথন ডিকের জন্য জেনেরিক মুদ্রণ ফাংশন লেখার চেষ্টা করছিলাম না। শীর্ষ রেট করা মন্তব্যগুলি ইতিমধ্যে প্রদর্শন করে যে কীভাবে ডিকটি প্রিন্ট করা যায়। আমার অবদান ছিল পাইথন ২.7-এ ট্যাবগুলির পরিবর্তে ইনডেন্টিংয়ের জন্য '\ t' দিয়ে json.dumps এর বিকল্প লিখতে।
আল কনরাড

আমি json.dumps এর বিকল্প লেখার বিষয়ে আপনার সাথে একমত, আমার জন্য json.dumps হিসাবে একই সমস্যা প্রযোজ্য। এছাড়াও, আপনি আপনার কোডকে আরও সহজ করে ইন্ডেন্টেশনের ধরণের পরিবর্তন করতে একটি সাধারণ রেজেক্স ব্যবহার করতে পারেন।
y.petremann

0

"Parentষধ" অভিধানে ট্র্যাক রাখার সময় এমন কিছু যা নেস্টেড ডিকশনারি মুদ্রণ করবে।

dicList = list()

def prettierPrint(dic, dicList):
count = 0
for key, value in dic.iteritems():
    count+=1
    if str(value) == 'OrderedDict()':
        value = None
    if not isinstance(value, dict):
        print str(key) + ": " + str(value)
        print str(key) + ' was found in the following path:',
        print dicList
        print '\n'
    elif isinstance(value, dict):
        dicList.append(key)
        prettierPrint(value, dicList)
    if dicList:
         if count == len(dic):
             dicList.pop()
             count = 0

prettierPrint(dicExample, dicList)

এটি ওপিতে বর্ণিত একটির মতো বিভিন্ন ফর্ম্যাট অনুযায়ী মুদ্রণের জন্য একটি ভাল সূচনা পয়েন্ট । আপনাকে যা করতে হবে তা হ'ল প্রিন্ট ব্লকগুলির চারপাশে কাজ করা । দ্রষ্টব্য যে এটি 'অর্ডারডিক্ট ()' হয় কিনা তা দেখতে দেখতে মনে হচ্ছে। আপনি কনটেইনার ডেটাটাইপস সংগ্রহগুলি থেকে কিছু ব্যবহার করছেন কিনা তার উপর নির্ভর করে আপনার এই ধরণের ব্যর্থ- নিরাপদ করা উচিত যাতে এলিফ ব্লকটির নামের কারণে এটি কোনও অতিরিক্ত অভিধান হিসাবে দেখা যায় না। এখন হিসাবে, একটি উদাহরণ অভিধান পছন্দ

example_dict = {'key1': 'value1',
            'key2': 'value2',
            'key3': {'key3a': 'value3a'},
            'key4': {'key4a': {'key4aa': 'value4aa',
                               'key4ab': 'value4ab',
                               'key4ac': 'value4ac'},
                     'key4b': 'value4b'}

মুদ্রণ করবে

key3a: value3a
key3a was found in the following path: ['key3']

key2: value2
key2 was found in the following path: []

key1: value1
key1 was found in the following path: []

key4ab: value4ab
key4ab was found in the following path: ['key4', 'key4a']

key4ac: value4ac
key4ac was found in the following path: ['key4', 'key4a']

key4aa: value4aa
key4aa was found in the following path: ['key4', 'key4a']

key4b: value4b
key4b was found in the following path: ['key4']

question প্রশ্নের ফর্ম্যাট মাপসই কোড পরিবর্তন করা ~

lastDict = list()
dicList = list()
def prettierPrint(dic, dicList):
    global lastDict
    count = 0
    for key, value in dic.iteritems():
        count+=1
        if str(value) == 'OrderedDict()':
            value = None
        if not isinstance(value, dict):
            if lastDict == dicList:
                sameParents = True
            else:
                sameParents = False

            if dicList and sameParents is not True:
                spacing = ' ' * len(str(dicList))
                print dicList
                print spacing,
                print str(value)

            if dicList and sameParents is True:
                print spacing,
                print str(value)
            lastDict = list(dicList)

        elif isinstance(value, dict):
            dicList.append(key)
            prettierPrint(value, dicList)

        if dicList:
             if count == len(dic):
                 dicList.pop()
                 count = 0

একই উদাহরণ কোড ব্যবহার করে, এটি নিম্নলিখিত মুদ্রণ করবে:

['key3']
         value3a
['key4', 'key4a']
                  value4ab
                  value4ac
                  value4aa
['key4']
         value4b

এটি ঠিক ওপিতে অনুরোধ করা হয়নি। পার্থক্যটি হ'ল পিতা-মাতা still n এখনও অনুপস্থিত থাকার পরিবর্তে এবং সাদা-স্থানের পরিবর্তে মুদ্রিত। ওপি এর বিন্যাসে পেতে, আপনি নিম্নলিখিত ভালো কিছু করতে প্রয়োজন হবে: iteratively এই তুলনা dicList সঙ্গে lastDict । আপনি চেক যদি একটি নতুন অভিধান তৈরীর এবং এটি dicList বিষয়বস্তু কপি করে এটি করতে পারেন, আমি কপি অভিধানে হিসাবে একই আমি lastDict, এবং - যদি এটা - যে হোয়াইটস্পেস লেখা আমি স্ট্রিং গুণক ফাংশন ব্যবহার করে অবস্থান ।


0

এই লিঙ্ক থেকে :

def prnDict(aDict, br='\n', html=0,
            keyAlign='l',   sortKey=0,
            keyPrefix='',   keySuffix='',
            valuePrefix='', valueSuffix='',
            leftMargin=0,   indent=1 ):
    '''
return a string representive of aDict in the following format:
    {
     key1: value1,
     key2: value2,
     ...
     }

Spaces will be added to the keys to make them have same width.

sortKey: set to 1 if want keys sorted;
keyAlign: either 'l' or 'r', for left, right align, respectively.
keyPrefix, keySuffix, valuePrefix, valueSuffix: The prefix and
   suffix to wrap the keys or values. Good for formatting them
   for html document(for example, keyPrefix='<b>', keySuffix='</b>'). 
   Note: The keys will be padded with spaces to have them
         equally-wide. The pre- and suffix will be added OUTSIDE
         the entire width.
html: if set to 1, all spaces will be replaced with '&nbsp;', and
      the entire output will be wrapped with '<code>' and '</code>'.
br: determine the carriage return. If html, it is suggested to set
    br to '<br>'. If you want the html source code eazy to read,
    set br to '<br>\n'

version: 04b52
author : Runsun Pan
require: odict() # an ordered dict, if you want the keys sorted.
         Dave Benjamin 
         http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/161403
    '''

    if aDict:

        #------------------------------ sort key
        if sortKey:
            dic = aDict.copy()
            keys = dic.keys()
            keys.sort()
            aDict = odict()
            for k in keys:
                aDict[k] = dic[k]

        #------------------- wrap keys with ' ' (quotes) if str
        tmp = ['{']
        ks = [type(x)==str and "'%s'"%x or x for x in aDict.keys()]

        #------------------- wrap values with ' ' (quotes) if str
        vs = [type(x)==str and "'%s'"%x or x for x in aDict.values()] 

        maxKeyLen = max([len(str(x)) for x in ks])

        for i in range(len(ks)):

            #-------------------------- Adjust key width
            k = {1            : str(ks[i]).ljust(maxKeyLen),
                 keyAlign=='r': str(ks[i]).rjust(maxKeyLen) }[1]

            v = vs[i]        
            tmp.append(' '* indent+ '%s%s%s:%s%s%s,' %(
                        keyPrefix, k, keySuffix,
                        valuePrefix,v,valueSuffix))

        tmp[-1] = tmp[-1][:-1] # remove the ',' in the last item
        tmp.append('}')

        if leftMargin:
          tmp = [ ' '*leftMargin + x for x in tmp ]

        if html:
            return '<code>%s</code>' %br.join(tmp).replace(' ','&nbsp;')
        else:
            return br.join(tmp)     
    else:
        return '{}'

'''
Example:

>>> a={'C': 2, 'B': 1, 'E': 4, (3, 5): 0}

>>> print prnDict(a)
{
 'C'   :2,
 'B'   :1,
 'E'   :4,
 (3, 5):0
}

>>> print prnDict(a, sortKey=1)
{
 'B'   :1,
 'C'   :2,
 'E'   :4,
 (3, 5):0
}

>>> print prnDict(a, keyPrefix="<b>", keySuffix="</b>")
{
 <b>'C'   </b>:2,
 <b>'B'   </b>:1,
 <b>'E'   </b>:4,
 <b>(3, 5)</b>:0
}

>>> print prnDict(a, html=1)
<code>{
&nbsp;'C'&nbsp;&nbsp;&nbsp;:2,
&nbsp;'B'&nbsp;&nbsp;&nbsp;:1,
&nbsp;'E'&nbsp;&nbsp;&nbsp;:4,
&nbsp;(3,&nbsp;5):0
}</code>

>>> b={'car': [6, 6, 12], 'about': [15, 9, 6], 'bookKeeper': [9, 9, 15]}

>>> print prnDict(b, sortKey=1)
{
 'about'     :[15, 9, 6],
 'bookKeeper':[9, 9, 15],
 'car'       :[6, 6, 12]
}

>>> print prnDict(b, keyAlign="r")
{
        'car':[6, 6, 12],
      'about':[15, 9, 6],
 'bookKeeper':[9, 9, 15]
}
'''

0

আমি শুধু নেওয়ার পর এই প্রশ্নের ফেরত দিচ্ছি হেলায় এর উত্তর ও একটি ছোট্ট কিন্তু খুব দরকারী পরিমার্জন করে। এই ফাংশনটি JSON গাছের সমস্ত কী পাশাপাশি সেই গাছের পাতার নোডের আকার মুদ্রণ করে ।

def print_JSON_tree(d, indent=0):
    for key, value in d.iteritems():
        print '    ' * indent + unicode(key),
        if isinstance(value, dict):
            print; print_JSON_tree(value, indent+1)
        else:
            print ":", str(type(d[key])).split("'")[1], "-", str(len(unicode(d[key])))

আপনার কাছে বড় JSON অবজেক্ট থাকে এবং মাংসটি কোথায় তা নির্ধারণ করতে চাইলে এটি সত্যিই দুর্দান্ত। উদাহরণ :

>>> print_JSON_tree(JSON_object)
key1
    value1 : int - 5
    value2 : str - 16
    key2
       value1 : str - 34
       value2 : list - 5623456

এটি আপনাকে বলবে যে আপনার যত্ন নেওয়া বেশিরভাগ ডেটা সম্ভবত অভ্যন্তরের JSON_object['key1']['key2']['value2']কারণ স্ট্রিং হিসাবে ফর্ম্যাট হওয়া মানটির দৈর্ঘ্য খুব বেশি large


0

এই ফাংশনটি ব্যবহার করুন:

def pretty_dict(d, n=1):
    for k in d:
        print(" "*n + k)
        try:
            pretty_dict(d[k], n=n+4)
        except TypeError:
            continue

এটিকে কল করুন:

pretty_dict(mydict)

মানগুলি স্ট্রিং হলে এটি কাজ করে না। এটি স্ট্রিংয়ের প্রতিটি অক্ষরকে একটি নতুন লাইনে মুদ্রণ করে তবে কীগুলি ঠিক আছে বলে মনে হচ্ছে।
অ্যান্টনি

0

একটি ক্লাসে কাজ করার সময় আমি এটি নিয়ে এসেছি যার একটি .txt ফাইলে একটি অভিধান লেখার দরকার ছিল:

@staticmethod
def _pretty_write_dict(dictionary):

    def _nested(obj, level=1):
        indentation_values = "\t" * level
        indentation_braces = "\t" * (level - 1)
        if isinstance(obj, dict):
            return "{\n%(body)s%(indent_braces)s}" % {
                "body": "".join("%(indent_values)s\'%(key)s\': %(value)s,\n" % {
                    "key": str(key),
                    "value": _nested(value, level + 1),
                    "indent_values": indentation_values
                } for key, value in obj.items()),
                "indent_braces": indentation_braces
            }
        if isinstance(obj, list):
            return "[\n%(body)s\n%(indent_braces)s]" % {
                "body": "".join("%(indent_values)s%(value)s,\n" % {
                    "value": _nested(value, level + 1),
                    "indent_values": indentation_values
                } for value in obj),
                "indent_braces": indentation_braces
            }
        else:
            return "\'%(value)s\'" % {"value": str(obj)}

    dict_text = _nested(dictionary)
    return dict_text

এখন, আমাদের যদি এর মতো একটি অভিধান থাকে:

some_dict = {'default': {'ENGINE': [1, 2, 3, {'some_key': {'some_other_key': 'some_value'}}], 'NAME': 'some_db_name', 'PORT': '', 'HOST': 'localhost', 'USER': 'some_user_name', 'PASSWORD': 'some_password', 'OPTIONS': {'init_command': 'SET foreign_key_checks = 0;'}}}

এবং আমরা কি:

print(_pretty_write_dict(some_dict))

আমরা পেতে:

{
    'default': {
        'ENGINE': [
            '1',
            '2',
            '3',
            {
                'some_key': {
                    'some_other_key': 'some_value',
                },
            },
        ],
        'NAME': 'some_db_name',
        'OPTIONS': {
            'init_command': 'SET foreign_key_checks = 0;',
        },
        'HOST': 'localhost',
        'USER': 'some_user_name',
        'PASSWORD': 'some_password',
        'PORT': '',
    },
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.