Julia中的嵌套数组理解

时间:2015-12-08 18:26:55

标签: list-comprehension julia

我试图在Julia中获取具有新walkdir功能的文件列表。以下工作,但我希望结果是一个平面的文件列表。这可以通过数组理解来实现,而不是在数组创建后展平它吗?

files = [[joinpath(root, file) for file in files] for (root, dirs, files) in collect(walkdir(AUDIO_PATH))]

3 个答案:

答案 0 :(得分:2)

据我所知,这不能通过数组理解来解决,不会在创建数组后展平数组。但是你可以定义一个迭代walkdir的函数:

function files_func(path)
    function it()
        for (root, dirs, files) in walkdir(path)
            for file in files
                produce(joinpath(root,file))
            end
        end
    end
    Task(it)
end

定义此功能时,可以通过collect(files_func(AUDIO_PATH))获取文件列表。另外 可以通过将walkdir循环为:

来获取文件列表
allfiles=ASCIIString[]
for (root, dirs, files) in walkdir(path)
   for file in files
       push!(allfiles,joinpath(root,file))
   end
end
allfiles

答案 1 :(得分:1)

正如@DanielHøegh所指出的,似乎你不能。但您可以使用vcat函数轻松展平它:

all_files(path::AbstractString) = vcat([[joinpath(root, file) for file in files] for (root, dirs, files) in collect(walkdir(path))]...)

这个更易读的版本就像Daniel的迭代器/生成器一样,但是使用了笛卡儿积for循环语法,替代@task宏(只是为了展示它的例子)和紧凑的赋值函数定义语法:

function each_file(path::AbstractString)
    iter() = for (root, dirs, files) in walkdir(path), file in files
        produce(joinpath(root, file))
    end
    @task iter()
end

# No need to flatten anything:
all_files(path::AbstractString) = collect(each_file(path))

for file in each_file(AUDIO_PATH)
    @show file
end    

audio_files = all_files(AUDIO_PATH)

答案 2 :(得分:0)

一个没有理解但可读的选项(对于我的人类神经软件):

filelist = AbstractString[]
for (root, dirs, files) in walkdir(AUDIO_PATH)
    append!(filelist,map(_->joinpath(root,_),files))
end

匿名函数和映射可能会产生性能成本,但与可读性相比,它在文件映射代码中的重要性应该较低。