字典 #
一、字典基础 #
1.1 创建字典 #
使用Dict创建字典:
julia
d1 = Dict("a" => 1, "b" => 2, "c" => 3)
d2 = Dict(:a => 1, :b => 2, :c => 3)
d3 = Dict{String, Int}()
d4 = Dict()
1.2 字典类型 #
julia
typeof(Dict("a" => 1))
typeof(Dict(:a => 1))
typeof(Dict{String, Int}())
1.3 从数组创建 #
julia
Dict(["a", "b", "c"] .=> [1, 2, 3])
Dict(zip(["a", "b", "c"], [1, 2, 3]))
Dict([("a", 1), ("b", 2), ("c", 3)])
1.4 字典推导 #
julia
Dict(string(i) => i^2 for i in 1:5)
Dict(i => i^2 for i in 1:5 if i % 2 == 0)
二、访问元素 #
2.1 基本访问 #
julia
d = Dict("a" => 1, "b" => 2, "c" => 3)
d["a"]
d["b"]
2.2 安全访问 #
julia
d = Dict("a" => 1, "b" => 2)
d["c"]
get(d, "c", 0)
get(d, "a", 0)
get(d, "c") do
"default"
end
2.3 检查键存在 #
julia
d = Dict("a" => 1, "b" => 2)
haskey(d, "a")
haskey(d, "c")
"a" in keys(d)
"c" ∈ keys(d)
2.4 获取键和值 #
julia
d = Dict("a" => 1, "b" => 2, "c" => 3)
keys(d)
values(d)
pairs(d)
collect(keys(d))
collect(values(d))
三、修改字典 #
3.1 添加元素 #
julia
d = Dict{String, Int}()
d["a"] = 1
d["b"] = 2
d
3.2 修改元素 #
julia
d = Dict("a" => 1, "b" => 2)
d["a"] = 10
d
3.3 删除元素 #
julia
d = Dict("a" => 1, "b" => 2, "c" => 3)
delete!(d, "a")
pop!(d, "b")
pop!(d, "c", 0)
empty!(d)
3.4 get! 函数 #
julia
d = Dict("a" => 1)
get!(d, "a", 10)
get!(d, "b", 20)
d
3.5 getkey #
julia
d = Dict("a" => 1, "b" => 2)
getkey(d, "a", "default")
getkey(d, "c", "default")
四、字典操作 #
4.1 合并字典 #
julia
d1 = Dict("a" => 1, "b" => 2)
d2 = Dict("c" => 3, "d" => 4)
merge(d1, d2)
merge(d1, Dict("b" => 20))
4.2 合并并修改 #
julia
d1 = Dict("a" => 1, "b" => 2)
d2 = Dict("b" => 20, "c" => 3)
merge!(d1, d2)
d1
4.3 字典过滤 #
julia
d = Dict("a" => 1, "b" => 2, "c" => 3, "d" => 4)
filter(p -> p.second > 2, d)
filter(p -> p.first in ["a", "b"], d)
4.4 字典映射 #
julia
d = Dict("a" => 1, "b" => 2, "c" => 3)
Dict(k => v^2 for (k, v) in d)
mapvals(f, d) = Dict(k => f(v) for (k, v) in d)
mapvals(x -> x^2, d)
五、字典迭代 #
5.1 迭代键值对 #
julia
d = Dict("a" => 1, "b" => 2, "c" => 3)
for (k, v) in d
println("$k => $v")
end
5.2 迭代键 #
julia
d = Dict("a" => 1, "b" => 2, "c" => 3)
for k in keys(d)
println(k)
end
5.3 迭代值 #
julia
d = Dict("a" => 1, "b" => 2, "c" => 3)
for v in values(d)
println(v)
end
5.4 迭代索引 #
julia
d = Dict("a" => 1, "b" => 2, "c" => 3)
for (i, (k, v)) in enumerate(d)
println("$i: $k => $v")
end
六、字典信息 #
6.1 基本信息 #
julia
d = Dict("a" => 1, "b" => 2, "c" => 3)
length(d)
isempty(d)
eltype(d)
keytype(d)
valtype(d)
6.2 查找值 #
julia
d = Dict("a" => 1, "b" => 2, "c" => 3)
findfirst(p -> p.second == 2, d)
findall(p -> p.second > 1, d)
in(1, values(d))
in(("a", 1), pairs(d))
七、特殊字典 #
7.1 有序字典 #
使用OrderedCollections包:
julia
using Pkg
Pkg.add("OrderedCollections")
using OrderedCollections
od = OrderedDict("a" => 1, "b" => 2, "c" => 3)
7.2 默认值字典 #
julia
d = Dict{String, Vector{Int}}()
get!(d, "a", Int[])
push!(get!(d, "a", Int[]), 1)
使用DefaultDict:
julia
using OrderedCollections
dd = DefaultDict{String, Vector{Int}}(() -> Int[])
dd["a"]
push!(dd["a"], 1)
八、字典性能 #
8.1 时间复杂度 #
| 操作 | 平均 | 最坏 |
|---|---|---|
| 访问 | O(1) | O(n) |
| 插入 | O(1) | O(n) |
| 删除 | O(1) | O(n) |
8.2 键类型 #
使用不可变类型作为键:
julia
d = Dict{Symbol, Int}()
d[:a] = 1
d = Dict{Tuple{Int, Int}, Int}()
d[(1, 2)] = 3
8.3 自定义类型作为键 #
julia
struct Point
x::Int
y::Int
end
Base.hash(p::Point, h::UInt) = hash((p.x, p.y), h)
Base.:(==)(a::Point, b::Point) = a.x == b.x && a.y == b.y
d = Dict{Point, String}()
d[Point(1, 2)] = "A"
九、实践练习 #
9.1 练习1:词频统计 #
julia
function word_count(text::String)
words = split(lowercase(text))
counts = Dict{String, Int}()
for word in words
w = strip(word, ['.', ',', '!', '?'])
counts[w] = get(counts, w, 0) + 1
end
return counts
end
word_count("Hello world! Hello Julia!")
9.2 练习2:分组 #
julia
function group_by(arr, key_func)
groups = Dict{eltype(key_func(first(arr))), Vector{eltype(arr)}}()
for item in arr
key = key_func(item)
if !haskey(groups, key)
groups[key] = []
end
push!(groups[key], item)
end
return groups
end
group_by([1, 2, 3, 4, 5, 6], x -> x % 2)
9.3 练习3:缓存 #
julia
function memoize(f)
cache = Dict{Tuple, Any}()
function(args...)
key = args
if !haskey(cache, key)
cache[key] = f(args...)
end
return cache[key]
end
end
fib = memoize(function(n)
n <= 1 ? n : fib(n-1) + fib(n-2)
end)
fib(40)
9.4 练习4:配置管理 #
julia
struct Config
data::Dict{Symbol, Any}
end
Config() = Config(Dict{Symbol, Any}())
function Base.getindex(c::Config, key::Symbol)
get(c.data, key, nothing)
end
function Base.setindex!(c::Config, value, key::Symbol)
c.data[key] = value
end
function Base.haskey(c::Config, key::Symbol)
haskey(c.data, key)
end
config = Config()
config[:host] = "localhost"
config[:port] = 8080
config[:host]
十、总结 #
本章我们学习了:
- 字典创建:Dict构造函数和推导式
- 访问元素:索引访问和安全访问
- 修改字典:添加、修改、删除元素
- 字典操作:合并、过滤、映射
- 字典迭代:遍历键、值、键值对
- 特殊字典:有序字典、默认值字典
接下来让我们学习Julia的集合!
最后更新:2026-03-27