Julia中的嵌套列表理解

Julia中的嵌套列表理解,julia,Julia,在python中,我可以进行嵌套列表理解,例如,我可以将以下数组展平: a = [[1,2,3],[4,5,6]] [i for arr in a for i in arr] 获取[1,2,3,4,5,6] 如果我在Julia中尝试此语法,我会得到: julia> a ([1,2,3],[4,5,6],[7,8,9]) julia> [i for arr in a for i in arr] ERROR: syntax: expected ] Julia中是否可以嵌套列表理解?

在python中,我可以进行嵌套列表理解,例如,我可以将以下数组展平:

a = [[1,2,3],[4,5,6]]
[i for arr in a for i in arr]
获取
[1,2,3,4,5,6]

如果我在Julia中尝试此语法,我会得到:

julia> a
([1,2,3],[4,5,6],[7,8,9])

julia> [i for arr in a for i in arr]
ERROR: syntax: expected ]

Julia中是否可以嵌套列表理解?

列表理解在Julia中的工作方式有点不同:

> [(x,y) for x=1:2, y=3:4]
2x2 Array{(Int64,Int64),2}:
 (1,3)  (1,4)
 (2,3)  (2,4)
如果
a=[[1 2],[3 4],[5 6]]
是一个多维数组,
vec
会将其展平:

> vec(a)
6-element Array{Int64,1}:
 1
 2
 3
 4
 5
 6
因为a包含元组,所以在Julia中这有点复杂。这是可行的,但可能不是最好的处理方法:

function flatten(x, y)
    state = start(x)
    if state==false
        push!(y, x)
    else
        while !done(x, state) 
          (item, state) = next(x, state) 
          flatten(item, y)
        end 
    end
    y
end
flatten(x)=flatten(x,Array(Any, 0))
然后,我们可以运行:

> flatten([(1,2),(3,4)])
4-element Array{Any,1}:
 1
 2
 3
 4

你为什么要用向量元组?使用数组要简单得多,Ben已经用
vec
展示了这一点。但在这两种情况下,您也可以非常简单地使用理解:

julia> a = ([1,2,3],[4,5,6],[7,8,9]);
julia> [i for i in hcat(a...)]
9-element Array{Any,1}:
 1
 2
 ⋮

表达式
hcat(a…
“splats”您的元组并将其连接到一个数组中。但请记住,与Python不同,Julia使用列主数组语义。元组中有三个列向量;这就是你的意图吗?(如果它们是行向量-由空格分隔-您可以使用
[a..]
进行连接)。数组在所有元素中进行迭代,而不考虑它们的维数。

在这里使用数组构造函数可以获得一些好处(转换以节省空间)


没有足够的声誉发表评论,所以在@ben hammer发布了一个修改。感谢您提供的flatte()示例,它对我很有帮助

但是,如果元组/数组包含字符串,它确实会中断。由于
字符串
是可编辑的,因此函数将进一步将其分解为字符。我必须插入条件来检查
ascitring
以修复该问题。代码如下

    function flatten(x, y)
        state = start(x)
        if state==false
            push!(y, x)
        else
            if typeof(x) <: String
                push!(y, x)
            else 
                while (!done(x, state)) 
                    (item, state) = next(x, state) 
                    flatten(item, y)
                end
            end
        end
        y
    end
    flatten(x)=flatten(x,Array(Any, 0))
函数展平(x,y)
状态=开始(x)
如果state==false
推(y,x)
其他的

如果typeof(x)此功能已添加到julia v0.5中:

julia> a = ([1,2,3],[4,5,6],[7,8,9])
([1,2,3],[4,5,6],[7,8,9])

julia> [i for arr in a for i in arr]
9-element Array{Int64,1}:
 1
 2
 3
 4
 5
 6
 7
 8
 9

那么,没有办法像Python中那样使用列表理解来展平数组了吗?我对你的
a=[[1,2],[3,4],[5,6]]
语句感到非常困惑,因为
[[1,2],[3,4],[5,6]=[1,2,3,4,5,6]
返回
true
据我所知,Julia没有嵌套列表理解的概念。相反,它具有多变量理解,其中每个变量对应于输出数组的一个维度。考虑到这一点,你无法在Julia中平展列表。(还对答案进行了更正-复制了错误的数组)
julia> a = ([1,2,3],[4,5,6],[7,8,9])
([1,2,3],[4,5,6],[7,8,9])

julia> [i for arr in a for i in arr]
9-element Array{Int64,1}:
 1
 2
 3
 4
 5
 6
 7
 8
 9