如何在Python中漂亮地打印深度为~4的字典?我尝试用pprint()进行漂亮的打印,但它不起作用:
import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(mydict)
我只是想要一个缩进(“\t”)为每个嵌套,这样我就会得到这样的东西:
key1
value1
value2
key2
value1
value2
等。
我该怎么做呢?
如何在Python中漂亮地打印深度为~4的字典?我尝试用pprint()进行漂亮的打印,但它不起作用:
import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(mydict)
我只是想要一个缩进(“\t”)为每个嵌套,这样我就会得到这样的东西:
key1
value1
value2
key2
value1
value2
等。
我该怎么做呢?
当前回答
我自己是一个相对的python新手,但过去几周我一直在使用嵌套字典,这就是我想到的。
你应该尝试使用堆栈。将根字典中的键变成一个列表的列表:
stack = [ root.keys() ] # Result: [ [root keys] ]
按照从最后到第一个的相反顺序,查找字典中的每个键,看看它的值是否(也是)一个字典。如果不是,打印密钥,然后删除它。但是,如果键的值是一个字典,则打印该键,然后将该值的键附加到堆栈的末尾,并以相同的方式开始处理该列表,对每个新的键列表进行递归重复。
如果每个列表中第二个键的值是一个字典,那么在几轮之后,你会得到这样的结果:
[['key 1','key 2'],['key 2.1','key 2.2'],['key 2.2.1','key 2.2.2'],[`etc.`]]
这种方法的优点是缩进只是\t乘以堆栈的长度:
indent = "\t" * len(stack)
缺点是为了检查每个键,你需要散列到相关的子字典,尽管这可以通过列表理解和简单的for循环轻松处理:
path = [li[-1] for li in stack]
# The last key of every list of keys in the stack
sub = root
for p in path:
sub = sub[p]
if type(sub) == dict:
stack.append(sub.keys()) # And so on
注意,这种方法将要求清除尾随的空列表,并删除后跟空列表的任何列表中的最后一个键(当然,这可能会创建另一个空列表,等等)。
还有其他方法来实现这个方法,但希望这能给你一个基本的想法。
编辑:如果您不想进行所有这些操作,pprint模块将以良好的格式打印嵌套字典。
其他回答
我必须传递默认参数,就像这样:
print(json.dumps(my_dictionary, indent=4, default=str))
如果你想要键排序,你可以这样做:
print(json.dumps(my_dictionary, sort_keys=True, indent=4, default=str))
为了修复此类型错误:
TypeError: Object of type 'datetime' is not JSON serializable
这是由于datetimes是字典中的一些值。
最python化的方法之一是使用已经构建的pprint模块。
定义打印深度所需的参数与您预期的深度相同
import pprint
pp = pprint.PrettyPrinter(depth=4)
pp.pprint(mydict)
就是这样!
你可以使用打印字典
from print_dict import pd
dict1 = {
'key': 'value'
}
pd(dict1)
输出:
{
'key': 'value'
}
此Python代码的输出:
{
'one': 'value-one',
'two': 'value-two',
'three': 'value-three',
'four': {
'1': '1',
'2': '2',
'3': [1, 2, 3, 4, 5],
'4': {
'method': <function custom_method at 0x7ff6ecd03e18>,
'tuple': (1, 2),
'unicode': '✓',
'ten': 'value-ten',
'eleven': 'value-eleven',
'3': [1, 2, 3, 4]
}
},
'object1': <__main__.Object1 object at 0x7ff6ecc588d0>,
'object2': <Object2 info>,
'class': <class '__main__.Object1'>
}
安装:
$ pip install print-dict
披露:我是print-dict的作者
我不确定你到底想要什么样的格式,但你可以从这样一个函数开始:
def pretty(d, indent=0):
for key, value in d.items():
print('\t' * indent + str(key))
if isinstance(value, dict):
pretty(value, indent+1)
else:
print('\t' * (indent+1) + str(value))
我自己是一个相对的python新手,但过去几周我一直在使用嵌套字典,这就是我想到的。
你应该尝试使用堆栈。将根字典中的键变成一个列表的列表:
stack = [ root.keys() ] # Result: [ [root keys] ]
按照从最后到第一个的相反顺序,查找字典中的每个键,看看它的值是否(也是)一个字典。如果不是,打印密钥,然后删除它。但是,如果键的值是一个字典,则打印该键,然后将该值的键附加到堆栈的末尾,并以相同的方式开始处理该列表,对每个新的键列表进行递归重复。
如果每个列表中第二个键的值是一个字典,那么在几轮之后,你会得到这样的结果:
[['key 1','key 2'],['key 2.1','key 2.2'],['key 2.2.1','key 2.2.2'],[`etc.`]]
这种方法的优点是缩进只是\t乘以堆栈的长度:
indent = "\t" * len(stack)
缺点是为了检查每个键,你需要散列到相关的子字典,尽管这可以通过列表理解和简单的for循环轻松处理:
path = [li[-1] for li in stack]
# The last key of every list of keys in the stack
sub = root
for p in path:
sub = sub[p]
if type(sub) == dict:
stack.append(sub.keys()) # And so on
注意,这种方法将要求清除尾随的空列表,并删除后跟空列表的任何列表中的最后一个键(当然,这可能会创建另一个空列表,等等)。
还有其他方法来实现这个方法,但希望这能给你一个基本的想法。
编辑:如果您不想进行所有这些操作,pprint模块将以良好的格式打印嵌套字典。