Превратите Dict of Arrays в Array of Dicts со всеми уникальными комбинациями из Dict of Arrays - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть 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 голосов
/ 07 ноября 2018

Вот 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)
...