如何在julia中打印嵌套的dicts(或其他数据结构)?例如:
xx = Dict(
"a"=>77,
"b"=>55,
"c"=> Dict(
44=>"alfa",
55=>"beta",
66=>Dict(
"x"=>999,
"y"=>888
)
)
)
Run Code Online (Sandbox Code Playgroud)
ggg*_*ggg 11
您可以使用JSON.jl和大多数未记录的indent参数,例如
julia> using JSON
julia> print(json(xx,4))
{
"c": {
"55": "beta",
"66": {
"x": 999,
"y": 888
},
"44": "alfa"
},
"b": 55,
"a": 77
}
Run Code Online (Sandbox Code Playgroud)
当然,“漂亮”在于情人眼中,但是为什么不简单地做这样的事情呢?(我不知道预先实现的功能)
function pretty_print(d::Dict, pre=1)
for (k,v) in d
if typeof(v) <: Dict
s = "$(repr(k)) => "
println(join(fill(" ", pre)) * s)
pretty_print(v, pre+1+length(s))
else
println(join(fill(" ", pre)) * "$(repr(k)) => $(repr(v))")
end
end
nothing
end
Run Code Online (Sandbox Code Playgroud)
您上面的示例将如下打印。
julia> pretty_print(xx)
"c" =>
55 => "beta"
66 =>
"x" => 999
"y" => 888
44 => "alfa"
"b" => 55
"a" => 77
Run Code Online (Sandbox Code Playgroud)
逐级打印的替代版本
function pretty_print2(d::Dict, pre=1)
todo = Vector{Tuple}()
for (k,v) in d
if typeof(v) <: Dict
push!(todo, (k,v))
else
println(join(fill(" ", pre)) * "$(repr(k)) => $(repr(v))")
end
end
for (k,d) in todo
s = "$(repr(k)) => "
println(join(fill(" ", pre)) * s)
pretty_print2(d, pre+1+length(s))
end
nothing
end
Run Code Online (Sandbox Code Playgroud)
输出:
julia> pretty_print2(xx)
"b" => 55
"a" => 77
"c" =>
55 => "beta"
44 => "alfa"
66 =>
"x" => 999
"y" => 888
Run Code Online (Sandbox Code Playgroud)
也许不是很笼统和表现出色,但您会明白的。
编辑:我忘了打印子词典的键。我将它留给读者来调整这方面的功能。
EDIT2:根据请求,我调整了原始版本,以同时打印子词典的键,并添加了一个(可能更漂亮的版本)逐级输出。