Julia中如何将配对向量合并为字典(非循环最佳实践)
Julia中合并重复键的键值对为集合字典的方法
以下是几种无需手动写完整for循环的Julia风格实现:
1. 纯Base Julia:reduce + mergewith
这是最简洁的原生实现,利用mergewith合并相同键的数组:
input_vec = [:a=>1, :b=>2, :c=>3, :a=>12, :b=>33] reduce(mergewith(vcat), (Dict(k => [v]) for (k, v) in input_vec))
原理:先将每个键值对转为只包含单元素数组的字典,再通过reduce和mergewith(vcat)把相同键的数组合并,最终得到目标字典。
2. 纯Base Julia:foldl + get! + push!
这种方式更直观,通过foldl遍历累积结果,get!自动初始化空数组:
input_vec = [:a=>1, :b=>2, :c=>3, :a=>12, :b=>33] foldl(input_vec; init=Dict{Symbol, Vector{Int}}()) do dict, (key, val) push!(get!(dict, key, Int[]), val) dict end
get!(dict, key, Int[])会检查字典中是否存在key,不存在则插入一个空Int数组,随后将值push进去。
3. 使用Accumulators包
这个包专为累积类操作设计,语义清晰:
先安装包:
using Pkg; Pkg.add("Accumulators")
然后实现:
using Accumulators input_vec = [:a=>1, :b=>2, :c=>3, :a=>12, :b=>33] # 直接累积 acc = Accumulator(Symbol, Vector{Int}) for (k, v) in input_vec push!(acc[k], v) end result_dict = Dict(acc) # 函数式风格 result_dict = foldl((acc, p) -> push!(acc[first(p)], last(p)), input_vec; init=Accumulator(Symbol, Vector{Int})) |> Dict
4. 使用DataFrames包(适合表格数据场景)
如果你的工作流已经涉及DataFrames,可以用groupby处理:
先安装包:
using Pkg; Pkg.add("DataFrames")
然后实现:
using DataFrames input_vec = [:a=>1, :b=>2, :c=>3, :a=>12, :b=>33] # 转换为DataFrame后分组 df = DataFrame(key=first.(input_vec), value=last.(input_vec)) result_dict = Dict(k => df[group, :value] for (k, group) in pairs(groupby(df, :key)))
内容的提问来源于stack exchange,提问作者Alphaharrius
相关产品推荐
相关产品推荐

