Julia中的嵌套列表理解
在python中,我可以进行嵌套列表理解,例如,我可以将以下数组展平: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中是否可以嵌套列表理解?
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