Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.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 如何打印包含多个列表和字典的嵌套字典?_Python_List_Dictionary - Fatal编程技术网

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)