Python 迭代嵌套字典并生成HTML的代码
我发现并修改了一些代码,这些代码在嵌套字典中进行迭代,并生成列出嵌套字典中所有键和值的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。姓“琼斯
员工。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(“
- 员工
- 姓名:杰克
- 姓:史密斯 地址
地址- 地址行2:“无”
- 邮政编码:“N10 2BC”
- 1:'59 Never Street'地址地址邮政编码:E1 1AB'
- 姓名:凯特
- 雇员
- 一,
- 名字:“杰克”
- 姓:史密斯
- 地址
- 地址行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))