मैंने कुछ कोड पाया और संशोधित किया है जो नेस्टेड शब्दकोशों के माध्यम से पुनरावृत्त करता है और HTML उत्पन्न करता है जो नेस्टेड शब्दकोश में सभी कुंजियों और मानों को सूचीबद्ध करता है। कोड ठीक है लेकिन कुछ चीजें हैं जिन्हें मैं सुधारना चाहता हूं:

  1. मौजूदा कोड एक वैश्विक चर पर निर्भर करता है जो मुझे नहीं लगता कि यह अच्छा अभ्यास है।
  2. कोड प्रत्येक फ़ील्ड के लिए पूर्ण पथ दोहराता है, जो थोड़ा लंबा है:
<li>employees.1.forename.'Jack'</li>
<li>employees.1.surname.'Smith'</li>
<li>employees.1.address.AddressLine1.'59 Never Street'</li>
<li>employees.1.address.AddressLine2.'Flat 10'</li>
<li>employees.1.address.PostTown.'London'</li>
<li>employees.1.address.Postcode.'E1 1AB'</li>
<li>employees.2.forename.'Kate'</li>
<li>employees.2.surname.'Jones'</li>
<li>employees.2.address.AddressLine1.'29 Acacia Avenue'</li><li>employees.2.address.AddressLine2.None</li>
<li>employees.2.address.PostTown.'London'</li>
<li>employees.2.address.Postcode.'N10 2BC'</li>

आदर्श रूप से फ़ील्ड निम्नानुसार अधिक पठनीय नेस्टेड प्रारूप में सूचीबद्ध होंगे:

<ul>
    <li>employees:</li>
        <ul>
            <li>1:</li>
            <ul>
                <li>forename:'Jack'</li>
                <li>surname: 'Smith'</li>
                <li>address:
                <ul>
                    <li>AddressLine1:'59 Never Street'</li>
                    <li>AddressLine2:'Flat 10'</li>
                    <li>PostTown: 'London'</li>
                    <li>Postcode:'E10 1AB'</li> 
                </ul>
            </ul>
        </ul>
        <ul>
            <li>1:</li>
            <ul>
                <li>forename:'Kate'</li>
                <li>surname: 'Jones'</li>
                <li>address:
                <ul>
                    <li>AddressLine1:'29 Acacia Avenue'</li>
                    <li>AddressLine2: None</li>
                    <li>PostTown: 'London'</li>
                    <li>Postcode:'N10 2BC'</li> 
                </ul>
            </ul>
        </ul>
</ul>

d = {
        'employees':
            {
            '1':
                {
                'forename': 'Jack',
                'surname': 'Smith',
                'address':
                    {
                    'AddressLine1': '59 Never Street',
                    'AddressLine2': 'Flat 10',
                    'PostTown': 'London',
                    'Postcode': 'E1 1AB'
                    }
                },
            '2':
                {
                'forename': 'Kate',
                'surname': 'Jones',
                'address':
                    {
                    'AddressLine1': '29 Acacia Avenue',
                    'AddressLine2': None,
                    'PostTown': 'London',
                    'Postcode': 'N10 2BC'
                    }
                }
            }
        }

def print_dict(v, prefix='<li>'):
        global out
        if isinstance(v, dict):
                for k, v2 in v.items():
                        p2 = "{}{}.".format(prefix, k)
                        print_dict(v2, p2)
        else:
                try: out = str(out) + prefix + repr(v) + '</li>'
                except: out = prefix + repr(v) + '</li>'
        return out

print(print_dict(d))
-1
rcx935 21 जिंदा 2020, 15:35

1 उत्तर

सबसे बढ़िया उत्तर

वांछित आउटपुट प्राप्त करने का एक संभावित समाधान yattag का उपयोग करना होगा:

>>> from yattag import Doc
>>> doc, tag, text = Doc().tagtext()
>>> d = { ... }
>>> 
>>> def f(d, tag, text):
...  with tag('ul'):
...   for k,v in d.items():
...     if type(v) == dict:
...      with tag('li'):
...       text(k)
...      f(v, tag, text)
...     else:
...      with tag('li'):
...       text(f"{k}: '{v}'")
... 
>>> f(d, tag, text)
>>> 
>>> doc.getvalue()
"<ul><li>employees</li><ul><li>1</li><ul><li>forename: 'Jack'</li><li>surname: 'Smith'</li><li>address</li><ul><li>AddressLine1: '59 Never Street'</li><li>AddressLine2: 'Flat 10'</li><li>PostTown: 'London'</li><li>Postcode: 'E1 1AB'</li></ul></ul><li>2</li><ul><li>forename: 'Kate'</li><li>surname: 'Jones'</li><li>address</li><ul><li>AddressLine1: '29 Acacia Avenue'</li><li>AddressLine2: 'None'</li><li>PostTown: 'London'</li><li>Postcode: 'N10 2BC'</li></ul></ul></ul></ul>"

यह यह भी दिखाता है कि आप global कीवर्ड का उपयोग करने से कैसे छुटकारा पाते हैं - आप चर को एक पैरामीटर के रूप में फ़ंक्शन में पास करते हैं।

एक अन्य विकल्प वर्ग का उपयोग करना होगा।

यदि आप बाहरी पुस्तकालय का उपयोग नहीं करना चाहते हैं:

>>> def f(d):
...  result = ['<ul>']
...  for k,v in d.items():
...   if type(v) == dict:
...    result.append(f'<li>{k}</li>')
...    result.extend(f(v))
...   else:
...    result.append(f"<li>{k}: '{v}'</li>")
...  result.append('</ul>')
...  return result
... 
>>> ''.join(f(d))
"<ul><li>employees</li><ul><li>1</li><ul><li>forename: 'Jack'</li><li>surname: 'Smith'</li><li>address</li><ul><li>AddressLine1: '59 Never Street'</li><li>AddressLine2: 'Flat 10'</li><li>PostTown: 'London'</li><li>Postcode: 'E1 1AB'</li></ul></ul><li>2</li><ul><li>forename: 'Kate'</li><li>surname: 'Jones'</li><li>address</li><ul><li>AddressLine1: '29 Acacia Avenue'</li><li>AddressLine2: 'None'</li><li>PostTown: 'London'</li><li>Postcode: 'N10 2BC'</li></ul></ul></ul></ul>"

दोनों विकल्पों का स्वरूपित आउटपुट इस तरह दिखता है: स्वरूपित आउटपुट इस तरह दिखेगा:

<ul>
    <li>employees</li>
    <ul>
        <li>1</li>
        <ul>
            <li>forename: 'Jack'</li>
            <li>surname: 'Smith'</li>
            <li>address</li>
            <ul>
                <li>AddressLine1: '59 Never Street'</li>
                <li>AddressLine2: 'Flat 10'</li>
                <li>PostTown: 'London'</li>
                <li>Postcode: 'E1 1AB'</li>
            </ul>
        </ul>
        <li>2</li>
        <ul>
            <li>forename: 'Kate'</li>
            <li>surname: 'Jones'</li>
            <li>address</li>
            <ul>
                <li>AddressLine1: '29 Acacia Avenue'</li>
                <li>AddressLine2: 'None'</li>
                <li>PostTown: 'London'</li>
                <li>Postcode: 'N10 2BC'</li>
            </ul>
        </ul>
    </ul>
</ul>
2
Alexander Pushkarev 21 जिंदा 2020, 13:41