You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 22:32:18