我想迭代一系列dicts并评估一次获取一个Dict的函数。在R-speak中我有一个列表列表,并希望为每个子列表提供我的函数 - 它以列表作为输入:
function dfun(d::Dict)
println(collect(keys(d)))
println(collect(values(d)))
end
# my dict of dicts
d = [1 => ["a" => 1.1], 2 => ["b" => 3.12]]
[2=>["b"=>3.12],1=>["a"=>1.1]]
# works?
julia> dfun(d[1])
ASCIIString["a"]
[1.1]
# maps?
map(dfun,d)
ERROR: no method dfun((Int64,Dict{ASCIIString,Float64}))
in map at abstractarray.jl:1183
这样做的正确方法是什么?我很惊讶它发送(Int64,Dict {ASCIIString,Float64})到函数而不只是Dict {ASCIIString,Float64}
(对不起交叉发布 - 但我认为搜索会更好......)
答案 0 :(得分:5)
在Julia中,遍历字典的迭代是对键/值对的迭代,而不是对值的迭代(或迭代遍历键,如在Python中):
julia> for x in d println(x); println(typeof(x)) end
(2,["b"=>3.12])
(Int64,Dict{ASCIIString,Float64})
(1,["a"=>1.1])
(Int64,Dict{ASCIIString,Float64})
这就是为什么你的地图获得(Int64,Dict{ASCIIString,Float64})
- 类型的args。如果你想要这些值,你可以特别要求:
julia> map(dfun, values(d))
ASCIIString["b"]
[3.12]
ASCIIString["a"]
[1.1]
2-element Array{Any,1}:
nothing
nothing
但是如果你没有从函数中返回任何东西,使用map
感觉有点奇怪,因为你正在构建一个不需要的数组。我只是做
julia> for v=values(d) dfun(v) end
ASCIIString["b"]
[3.12]
ASCIIString["a"]
[1.1]
答案 1 :(得分:2)
在邮件列表上得到答案:
map(dfun,values(d))