如何在Julia中使用map来模仿嵌套列表理解?

时间:2018-04-05 21:02:22

标签: julia list-comprehension

我想使用Julia的map函数来模仿嵌套列表理解。这种能力对于并行映射(pmap)特别有用。

例如,这个嵌套列表理解

[x+y for x in [0,10] for y in [1,2,3]]

产生了不错的结果

6-element Array{Int64,1}:
  1
  2
  3
 11
 12
 13

和这个

[x+y for x in [0,10], y in [1,2,3]]

产生同样好的

2×3 Array{Int64,2}:
  1   2   3
 11  12  13

这些结果中的任何一个都符合我的目的。

现在,我尽力用map

复制这些结果
map([0,10]) do x
    map([1,2,3]) do y
        x + y
    end
end

产生正确的结果,而不是我所赞赏的形式:

2-element Array{Array{Int64,1},1}:
 [1, 2, 3]   
 [11, 12, 13]

现在我知道有蛮力的方法可以得到我想要的结果,例如hcat / vcat输出或操纵输入到矩阵,但我想知道如果存在一个像嵌套列表理解一样优雅的解决方案。

2 个答案:

答案 0 :(得分:4)

我能想到的最简单的方法是使用理解并将它们与map(低利益)或pmap结合起来(这里你得到真正的价值)。

On Julia 0.7(使用在此版本中您在函数参数功能中进行解构的事实):

julia> map(((x,y) for x in [0,10] for y in [1,2,3])) do (x,y)
       x+y
       end
6-element Array{Int64,1}:
  1
  2
  3
 11
 12
 13

julia> map(((x,y) for x in [0,10], y in [1,2,3])) do (x,y)
       x+y
       end
2×3 Array{Int64,2}:
  1   2   3
 11  12  13

On Julia 0.6.2(不太好):

julia> map(((x,y) for x in [0,10] for y in [1,2,3])) do v
              v[1]+v[2]
              end
6-element Array{Int64,1}:
  1
  2
  3
 11
 12
 13

julia> map(((x,y) for x in [0,10], y in [1,2,3])) do v
              v[1]+v[2]
              end
2×3 Array{Int64,2}:
  1   2   3
 11  12  13

答案 1 :(得分:0)

您可以使用Iterators.product

julia> map(t -> t[1]+t[2], Iterators.product([0,10], [1,2,3]))
2×3 Array{Int64,2}:
  1   2   3
 11  12  13

Iterators.product返回一个元素为元组的迭代器。

(遗憾的是上面的匿名函数无法写成(x,y) -> x+y