字典 #

一、字典基础 #

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]

十、总结 #

本章我们学习了:

  1. 字典创建:Dict构造函数和推导式
  2. 访问元素:索引访问和安全访问
  3. 修改字典:添加、修改、删除元素
  4. 字典操作:合并、过滤、映射
  5. 字典迭代:遍历键、值、键值对
  6. 特殊字典:有序字典、默认值字典

接下来让我们学习Julia的集合!

最后更新:2026-03-27