Как группировать коллекцию по каким-то критериям в Юлии? - PullRequest
0 голосов
/ 14 июня 2019

С учетом списка

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

Как это можно сгруппировать во что-то вроде кода ниже? Есть ли встроенная функция (немного другая форма в порядке)?

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

Возможно, с чем-то вроде

group((symbol, value) -> symbol, list)

Ответы [ 2 ]

0 голосов
/ 15 июня 2019

Стандартная библиотека не имеет такой функции, в конце концов я написал ее сам

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

Было бы неплохо иметь ее в стандартной библиотеке

0 голосов
/ 15 июня 2019

Использование 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

...