飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • 第1章 认识Python

    • Python 历史与特点
    • Python 2 与 Python 3 的核心差异
    • 安装与运行 Python 2.7.18
    • 编码规范 PEP 8
  • 第2章 基础语法

    • 变量与对象
    • 数字类型
    • 字符串 str
    • Unicode 字符串
    • 运算符
    • 空值 None
  • 第3章 流程控制

    • if 条件语句
    • if-else 条件语句
    • if-elif-else 多分支
    • 条件表达式(三元运算符)
    • while 循环
    • for 循环
    • range 与 xrange
    • 循环控制:break、continue、pass
    • 循环 else 子句
  • 第4章 数据结构

    • 列表基础
    • 列表方法
    • 列表推导式
    • 元组
    • 字典基础
    • 字典方法
    • 字典循环技巧
    • 集合
    • 序列解包
    • 序列比较
  • 第5章 函数

    • 定义函数
    • 参数传递机制
    • 默认参数
    • 关键字参数
    • 可变参数
    • Lambda 表达式
    • 文档字符串
    • 函数对象
  • 第6章 模块与包

    • import 导入
    • 模块搜索路径
    • name 与主程序
    • 编译文件 .pyc 与 .pyo
    • 包结构
    • dir() 函数
  • 第7章 文件与IO

    • 打开与关闭文件
    • 文件读写方法
    • with 上下文管理器
    • 格式化输出:% 操作符
    • 格式化输出:str.format()
    • JSON 序列化
  • 第8章 面向对象

    • 类定义与实例化
    • init 构造方法
    • 类变量与实例变量
    • 方法调用与 self
    • 继承基础
    • 多重继承
    • 新式类与旧式类
    • 私有变量与名称改写
    • 属性装饰器 property
    • 类方法与静态方法
    • 魔术方法
    • 空类与数据记录
  • 第9章 异常处理

    • 异常类型
    • try-except
    • try-except-else-finally
    • 抛出异常 raise
    • 自定义异常
    • with 语句与上下文管理器
  • 第10章 迭代器与生成器

    • 迭代器协议
    • 生成器函数
    • 生成器表达式
    • itertools模块
  • 第11章 标准库精要

    • os模块
    • sys模块
    • datetime模块
    • re模块
    • json模块
    • collections模块
    • math与random模块
    • urllib2与网络请求
    • subprocess与命令执行
    • threading与并发
    • unittest与测试
    • 虚拟环境与包管理
  • 第12章 工程实践

    • 调试技巧
    • 性能分析
    • 文档与注释
    • 下一步学习

字典基础

字典(dict)是 Python 中最强大的数据结构之一。它存储键值对(key-value pairs),通过键来快速查找值。字典是无序的(Python 2.7 中)、可变的,键必须唯一且可哈希。

创建字典

# 空字典
empty = {}
empty = dict()

# 字面量
person = {"name": "Alice", "age": 25, "city": "Beijing"}

# 从键值对序列创建
pairs = [("a", 1), ("b", 2), ("c", 3)]
d = dict(pairs)
print d             # {'a': 1, 'c': 3, 'b': 2}

# 用关键字参数(键必须是合法标识符)
d = dict(name="Bob", age=30)
print d             # {'age': 30, 'name': 'Bob'}

访问与修改

d = {"name": "Alice", "age": 25}

# 访问
print d["name"]     # "Alice"
print d["age"]      # 25

# 键不存在时抛出 KeyError
print d["gender"]   # KeyError: 'gender'

# 安全访问:用 get()
print d.get("gender")       # None,不报错
print d.get("gender", "unknown")  # "unknown",提供默认值

# 修改
 d["age"] = 26
print d             # {'age': 26, 'name': 'Alice'}

# 添加新键
d["gender"] = "female"
print d             # {'age': 26, 'name': 'Alice', 'gender': 'female'}

键的限制

字典的键必须是不可变(可哈希)的对象:

# 合法键
 d = {
    "string": 1,        # str
    42: 2,              # int
    3.14: 3,            # float
    (1, 2): 4,          # tuple(元素也必须不可变)
    True: 5,            # bool
}

# 非法键
d = {
    [1, 2]: "A",        # TypeError: unhashable type: 'list'
    {"a": 1}: "B",      # TypeError: unhashable type: 'dict'
}

为什么键必须可哈希?因为字典底层使用哈希表实现。键的哈希值决定了值存储的位置,这样查找时间复杂度是 O(1)。如果键可变,哈希值会改变,导致找不到已存储的值。

键的唯一性

字典中每个键只能出现一次。重复赋值会覆盖旧值:

d = {"a": 1, "a": 2}
print d             # {'a': 2},第二个覆盖了第一个

d = {}
d["x"] = 1
d["x"] = 2
print d             # {'x': 2}

删除键值对

d = {"a": 1, "b": 2, "c": 3}

# del 语句
del d["a"]
print d             # {'c': 3, 'b': 2}

# pop():删除并返回值
val = d.pop("b")
print val           # 2
print d             # {'c': 3}

# pop() 键不存在时
d.pop("z")          # KeyError
d.pop("z", None)    # 返回 None,不报错

# 清空
d.clear()
print d             # {}

字典推导式

与列表推导式类似,字典也有推导式:

# 平方映射
squares = {x: x**2 for x in range(6)}
print squares       # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# 过滤
 even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
print even_squares  # {0: 0, 8: 64, 2: 4, 4: 16, 6: 36}

# 从两个列表创建字典
keys = ["a", "b", "c"]
values = [1, 2, 3]
d = {k: v for k, v in zip(keys, values)}
print d             # {'a': 1, 'c': 3, 'b': 2}

实际应用

# 计数器
words = ["apple", "banana", "apple", "cherry", "banana", "apple"]
counts = {}
for word in words:
    if word in counts:
        counts[word] += 1
    else:
        counts[word] = 1
print counts        # {'cherry': 1, 'banana': 2, 'apple': 3}

# 用 get() 简化
 counts = {}
for word in words:
    counts[word] = counts.get(word, 0) + 1

# 用 setdefault() 简化
counts = {}
for word in words:
    counts.setdefault(word, 0)
    counts[word] += 1

哈希冲突的说明

字典的 O(1) 查找是平均情况,最坏情况(所有键哈希冲突)是 O(n)。Python 的哈希表实现会自动扩容和重新哈希,保持较低的装载因子(通常 < 2/3),所以实际使用中几乎总是接近 O(1)。

上一页
元组
下一页
字典方法