使用数组Dict的所有唯一组合将数组Dict转换为Dicts Array

时间:2018-11-06 22:53:38

标签: arrays dictionary julia

我有一个数组的Dict,我想将其变成一个Dicts的数组,其中每个Dict都具有数组Dict的唯一组合。理想情况下,将存在一种解决方案,该解决方案可以使用任意数量的Dict键并且以与R的expand_grid相似的方式工作(但适用于Dicts而不是DataFrames)。在下面的示例中,我显示了一个示例字典,该数组要转换为Dicts数组。

d  = Dict{String,Array{Int}}(["a", "b", "c"] .=> [[1,2,3], [4], [5,6]])

desired_result = Array{Dict{String,Int}}([Dict{String,Int}(["a", "b", "c"] .=> [1,4,5]),
                                          Dict{String,Int}(["a", "b", "c"] .=> [1,4,6]),
                                          Dict{String,Int}(["a", "b", "c"] .=> [2,4,5]),
                                          Dict{String,Int}(["a", "b", "c"] .=> [2,4,6]),
                                          Dict{String,Int}(["a", "b", "c"] .=> [3,4,5]),
                                          Dict{String,Int}(["a", "b", "c"] .=> [3,4,6])])

当然,一种方法是将其附加到嵌套有for循环的数组中,但是如果有一种更优雅的方法也可以。

1 个答案:

答案 0 :(得分:2)

这里是2排纸:

d= Dict{String,Array{Int}}(["a", "b", "c"] .=> [[1,2,3], [4], [5,6]]);

ks= sort(collect(keys(d)));
[Dict(ks .=> val) for val in (collect(Iterators.product(getindex.((d,),ks)...))...,)]

这将产生:

6-element Array{Dict{String,Int64},1}:
 Dict("c"=>5,"b"=>4,"a"=>1)
 Dict("c"=>5,"b"=>4,"a"=>2)
 Dict("c"=>5,"b"=>4,"a"=>3)
 Dict("c"=>6,"b"=>4,"a"=>1)
 Dict("c"=>6,"b"=>4,"a"=>2)
 Dict("c"=>6,"b"=>4,"a"=>3)