如何按Julia中的某些条件对集合进行分组?

时间:2019-06-14 01:15:41

标签: julia

给出列表

list = [("a", 1), ("a", 2), ("b", 3)]

如何将其归类为以下代码? 有内置功能(可以使用稍微不同的形式)吗?

[
  [("a", 1), ("a", 2)]
  [("b", 3)]
]

可能带有类似

的内容
group((symbol, value) -> symbol, list)

2 个答案:

答案 0 :(得分:0)

使用DataFrames.jl

julia> using DataFrames                                                                           

julia> list = [(rand('a':'e'), rand(0:9)) for j in 1:8 ]
8-element Array{Tuple{Char,Int64},1}:                                                           
('b', 4)                                                                                       
('b', 4)                                                                                       
('d', 4)                                                                                       
('e', 8)                                                                                       
('b', 2)                                                                                       
('c', 4)                                                                                       
('c', 3)                                                                                       
('b', 5)   

julia> df = DataFrame(letter = first.(list), number = map(t -> t[2], list));                                                                                                                  

julia> gp = groupby(df, :letter);                                                                                                                                                             

julia> [[(r.letter, r.number) for r in eachrow(gdf)] for gdf in gp]                            
4-element Array{Array{Tuple{Char,Int64},1},1}:                                                  
[('b', 4), ('b', 4), ('b', 2), ('b', 5)]                                                       
[('d', 4)]                                                                                     
[('e', 8)]                                                                                     
[('c', 4), ('c', 3)] 

如果您的数据量很大,则可能需要JuliaDB.jl

答案 1 :(得分:0)

标准库没有这种功能,最终我自己写了

groupby(f, list::Array) = begin
  foldl(list; init = Dict()) do dict, v
    push!(get!(dict, f(v), []), v)
    dict
  end
end

最好在标准库中包含它