Python 如何打印包含多个列表和字典的嵌套字典?
输出格式:Python 如何打印包含多个列表和字典的嵌套字典?,python,list,dictionary,Python,List,Dictionary,输出格式: [[{'text': '\n ', 'category': 'cooking', 'title': {'text': 'Everyday Italian', 'lang': 'en'}, 'author': {'text': 'Giada De Laurentiis'}, 'year': {'text': '2005'}, 'price': {'text': '30.00'}}, {'text': '\n ', 'category': 'childr
[[{'text': '\n ', 'category': 'cooking', 'title': {'text': 'Everyday
Italian', 'lang': 'en'}, 'author': {'text': 'Giada De Laurentiis'}, 'year':
{'text': '2005'}, 'price': {'text': '30.00'}},
{'text': '\n ', 'category': 'children', 'title': {'text': 'Harry Potter',
'lang': 'en'}, 'author': {'text': 'J K. Rowling'}, 'year': {'text':
'2005'}, 'price': {'text': '29.99'}}, {'text': '\n ', 'category':
'web', 'title': {'text': 'XQuery Kick Start', 'lang': 'en'}, 'author':
[{'text': 'James McGovern'}, {'text': 'Per Bothner'}, {'text': 'Kurt
Cagle'}, {'text': 'James Linn'}, {'text': 'Vaidyanathan Nagarajan'}],
'year': {'text': '2003'}, 'price': {'text': '49.99'}}, {'text': '\n ',
'category': 'web', 'cover': 'paperback', 'title': {'text': 'Learning XML',
'lang': 'en'}, 'author': {'text': 'Erik T. Ray'}, 'year': {'text': '2003'},
'price': {'text': '39.95'}}]]
下面这样一个简单的循环应该可以得到所需的输出
category : cooking,
title : ['Everyday Italian', 'lang': 'en'],
author : Giada De Laurentiis,
year : '2005',
price : '30.00'
category : children,
title : ['Harry Potter', 'lang': 'en'],
author : 'J K. Rowling',
year : '2005',
price : '29.99'
category : web,
title : [ 'XQuery Kick Start''lang': 'en'],
author :[ 'James McGovern' , 'Per Bothner','Kurt Cagle','James Linn', 'Vaidyanathan Nagarajan'],
year : '2003',
price : '49.99'
category : web,
cover : paperback,
title : [ 'Learning XML','lang': 'en'],
author : 'Erik T. Ray',
year : '2003',
price : '39.95'
试试这些,它会将单个字典打印成您描述的格式。看看这个模块,它提供了一种打印数据结构的好方法,而无需编写自己的格式化程序。感谢您的编码练习。老兄,那输出格式很特别!:D很棘手,因为如果字符串是独立的,则不加引号,如果字符串来自
text
属性,则加引号。同样棘手的是,如果不仅仅是文本
,那么必须将这些内容放入[]
。还有一点不太明确,因为如果没有文本
,还有其他键呢
输出格式免责声明:
- 我认为在
'XQuery Kick Start'
- 我认为应该引用Giada De Laurentiis的话,因为它来自
“文本”
导入副本
def转换_值(填充):
如果类型(stuff)为str:
退货
如果类型(材料)为dict:
元素=[]
text=stuff.pop(“text”,“”)
如果文本:
elements.append(f“{text}”)#我们仅在确实存在文本条目时引用
如果不是东西:#dict只是空的
返回元素[0]#没有更多属性,因此文本周围不需要[]
extend(f“{key}”:“{transform_value(value)}”表示键,stuff.items()中的值)
如果类型(物料)为列表:
elements=[在stuff中e的转换值(e)]
#如果stuff不是str、dict或list中的一个,这显然会引发一个异常
返回f“[{,'.join(elements)}]”
def transform_pub(d:dict):
d=copy.deepcopy(d)#我们将删除密钥,这样就不会弄乱外部数据
tail=d.pop(“文本”,“”)
result=“,\n”.join(键的f'{key}:{transform_value(value)}',值在d.items()中)
返回结果+尾部
如果名称=“\uuuuu main\uuuuuuuu”:
对于数据中的子列表:
对于子列表中的发布:
打印(转换为发布(发布))
首先,我想通过某种递归对出版物本身使用相同的机制。但随后代码变得太复杂,因为发布时会附加文本
字段,而属性则会先添加该字段
一旦我放弃了完全结构化的解决方案,我就开始对出版物打印机进行测试:
导入pytest
从打印导入转换值
@pytest.mark.parametize('输入,输出'[
(“烹饪”、“烹饪”),
({“文本”:“J K.罗琳”},“'J K.罗琳'”),
({“lang”:“en”,“text”:“日常意大利语”},
“[‘日常意大利语’、‘lang’:‘en’”)”,
([{“文本”:“詹姆斯·麦戈文”},
{“text”:“perbothner”},
{“文本”:“Kurt Cagle”},
{“文本”:“詹姆斯·林恩”},
{“文本”:“Vaidyanathan Nagarajan”},
“['James McGovern','Per Bothner','Kurt Cagle','James Linn','Vaidyanathan Nagarajan'”
),
([{“text”:“Joe”}],“['Joe']”),
({a:“1”},['a':'1']),
])
def测试转换值(输入、输出):
断言转换_值(输入)=输出
您尝试过什么?
for entry in data[0]:
for k, v in entry.items():
print(k, ':', v)
def printBook(d):
del d['text']
for i in d:
if type(d[i]) == dict:
if len(d[i])==1:
d[i] = list(d[i].values())[0]
else:
d[i] = [('' if j=='text' else (j+':')) + d[i][j] for j in d[i]]
s = '\n'
for i,j in d.items():
s += f' {i} : {j} ,\n'
print(s)