如何在Dicts Dict上使用Julia地图?

时间:2014-06-02 15:36:25

标签: dictionary julia

我想迭代一系列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}

(对不起交叉发布 - 但我认为搜索会更好......)

2 个答案:

答案 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))