【问题标题】:How to use Julia map on a Dict of Dicts?如何在字典字典上使用 Julia 地图?
【发布时间】:2014-07-22 18:59:40
【问题描述】:

我想遍历一个字典集合并评估一个函数,该函数一次接收一个字典。在 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}

(很抱歉交叉发布 - 但我认为 SO 搜索起来要好得多......)

【问题讨论】:

    标签: dictionary julia


    【解决方案1】:

    在 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})-typed 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]
    

    【讨论】:

    • 哈哈,这是一个很好的观点。我使用map 的唯一原因是因为我想让它与pmap 一致(如果我在集群上,我会调用相同的函数)。但我想我可以使用@parallel for?我读到:Julia 的 pmap 是为每个函数调用都执行大量工作的情况而设计的。 这是我的情况 - 因此是 pmap。有什么想法吗?
    • map vs not-map(与pmap相同)是关于构建返回值数组是否有意义。如果是(即使返回值相对无聊,例如您期望的成功布尔值数组大多为 True),则使用 map。如果没有,那你还不如避开它。
    【解决方案2】:

    在邮件列表中得到了答复:

    map(dfun,values(d))
    

    【讨论】:

      猜你喜欢
      • 2021-07-01
      • 2016-07-14
      • 2017-04-03
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多