Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 迭代嵌套字典并生成HTML的代码_Python_Python 3.x - Fatal编程技术网

Python 迭代嵌套字典并生成HTML的代码

Python 迭代嵌套字典并生成HTML的代码,python,python-3.x,Python,Python 3.x,我发现并修改了一些代码,这些代码在嵌套字典中进行迭代,并生成列出嵌套字典中所有键和值的HTML。代码还行,但有几点我想改进: 现有的代码依赖于一个全局变量,我认为这不是一个好的实践 代码会重复每个字段的完整路径,该路径有点长: 员工。1.直呼“杰克” 员工。1.姓“史密斯” 员工1.地址1.地址行1.“Never Street 59” 员工.1.地址.地址行2.“10号公寓” 员工。1。地址。邮政城。‘伦敦’ 员工。1。地址。邮政编码。“E1 1AB” 员工。2.直呼“凯特” 员工。2。姓“琼斯

我发现并修改了一些代码,这些代码在嵌套字典中进行迭代,并生成列出嵌套字典中所有键和值的HTML。代码还行,但有几点我想改进:

  • 现有的代码依赖于一个全局变量,我认为这不是一个好的实践
  • 代码会重复每个字段的完整路径,该路径有点长:
  • 员工。1.直呼“杰克”
  • 员工。1.姓“史密斯”
  • 员工1.地址1.地址行1.“Never Street 59”
  • 员工.1.地址.地址行2.“10号公寓”
  • 员工。1。地址。邮政城。‘伦敦’
  • 员工。1。地址。邮政编码。“E1 1AB”
  • 员工。2.直呼“凯特”
  • 员工。2。姓“琼斯”
  • 员工。2.地址。地址行1.“相思大道29号”
  • 员工。2.地址。地址行2.无
  • 员工。2。地址。邮政城。‘伦敦’
  • 员工。2。地址。邮政编码。“N10 2BC”
  • 理想情况下,字段将以更可读的嵌套格式列出,如下所示:

    • 雇员:
      • 1:
        • 名字:“杰克”
        • 姓:史密斯
        • 地址:
          • 地址行1:'59 Never Street'
          • 地址行2:‘10号公寓’
          • 邮递城:“伦敦”
          • 邮政编码:“E10 1AB”
      • 1:
        • 名字:“凯特”
        • 姓:“琼斯”
        • 地址:
          • 地址行1:‘相思大道29号’
          • 地址行2:无
          • 邮递城:“伦敦”
          • 邮政编码:“N10 2BC”
    
    d={
    ‘雇员’:
    {
    '1':
    {
    '名字':'杰克',
    ‘姓’:‘史密斯’,
    “地址”:
    {
    '地址行1':'59 Never Street',
    “AddressLine2”:“Flat10”,
    “邮镇”:“伦敦”,
    “邮政编码”:“E1 1AB”
    }
    },
    '2':
    {
    “名字”:“凯特”,
    “姓氏”:“琼斯”,
    “地址”:
    {
    “地址线1”:“相思大道29号”,
    “AddressLine2”:无,
    “邮镇”:“伦敦”,
    “邮政编码”:“N10 2BC”
    }
    }
    }
    }
    def print_dict(v,前缀=“
  • ”): 全球输出 如果存在(v,dict): 对于k,v.items()中的v2: p2=“{}{}.”格式(前缀,k) 打印指令(v2,p2) 其他: try:out=str(out)+前缀+repr(v)+'
  • ' 除了:out=前缀+repr(v)+'' 返回 打印(打印命令(d))
    获得所需输出的一种可能解决方案是使用:

    来自yattag导入文档的
    >>
    >>>doc,tag,text=doc().tagtext()
    >>>d={…}
    >>> 
    >>>def f(d,标签,文本):
    ...  带标签('ul'):
    ...   对于d.项()中的k,v:
    ...     如果类型(v)=dict:
    ...      带标记('li'):
    ...       文本(k)
    ...      f(v、标记、文本)
    ...     其他:
    ...      带标记('li'):
    ...       文本(f“{k}:'{v}'”)
    ... 
    >>>f(d,标签,文本)
    >>> 
    >>>doc.getvalue()
    “
    • 员工
        • 姓名:杰克
        • 姓:史密斯
        • 地址地址
          1:'59 Never Street'地址地址邮政编码:E1 1AB'
            姓名:凯特
          • 地址行2:“无”
          • 邮政编码:“N10 2BC”
        <
    它还显示了如何摆脱使用
    global
    关键字-将变量作为参数传递给函数

    另一种选择是使用类

    如果不想使用外部库,请执行以下操作:

    定义f(d): ... 结果=['
      '] ... 对于d.项()中的k,v: ... 如果类型(v)=dict: ... result.append(f'
    • {k}
    • ')) ... 结果:扩展(f(v)) ... 其他: ... result.append(f“
    • {k}:'{v}'
    • ”) ... result.append(“
    ”) ... 返回结果 ... >>>''加入(f(d)) “
    • 员工
        • 姓名:杰克
        • 姓:史密斯
        • 地址地址
          1:'59 Never Street'地址地址邮政编码:E1 1AB'
            姓名:凯特
          • 地址行2:“无”
          • 邮政编码:“N10 2BC”
        < 两个选项的格式化输出如下所示: 格式化输出如下所示:

        • 雇员
          • 一,
            • 名字:“杰克”
            • 姓:史密斯
            • 地址
              • 地址行1:“Never Street 59”
              • 地址行2:‘10号公寓’
              • 邮递城:“伦敦”
              • 邮政编码:“E1 1AB”
          • 二,
            • 名字:“凯特”
            • 姓:“琼斯”
            • 地址
              • 地址行1:‘相思大道29号’
              • 地址线
                
                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))