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

    • 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章 工程实践

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

字典循环技巧

遍历字典是日常编程中最常见的操作之一。Python 提供了多种遍历方式,选择合适的方式能让代码更简洁、更高效。

遍历键

默认情况下,for 循环遍历字典的键:

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

for key in d:
    print key

# 输出(顺序不确定):
# a
# c
# b

显式写法:

for key in d.iterkeys():    # 推荐,省内存
    print key

for key in d.keys():        # 创建完整列表,不推荐
    print key

遍历值

for value in d.itervalues():
    print value

# 输出:
# 1
# 3
# 2

注意:遍历值时无法知道对应的键。如果需要键值一起处理,遍历键值对。

遍历键值对

for key, value in d.iteritems():
    print key, "=", value

# 输出:
# a = 1
# c = 3
# b = 2

d.iteritems() 返回迭代器,每次产生一个 (key, value) 元组,然后拆包给 key 和 value。这是遍历字典最常用、最高效的方式。

对比低效写法:

# 低效:先查键,再查值
for key in d:
    print key, d[key]       # 两次哈希查找

# 高效:一次迭代直接获取键值对
for key, value in d.iteritems():
    print key, value        # 一次操作

同时修改字典的问题

在遍历字典时添加或删除键是危险的:

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

# 错误:遍历时删除
for key in d:
    if key == "b":
        del d[key]          # RuntimeError: dictionary changed size during iteration

正确做法是遍历键的副本:

# 方法 1:遍历副本
for key in d.keys():        # keys() 返回列表(副本)
    if key == "b":
        del d[key]

# 方法 2:先收集要删除的键
keys_to_remove = [k for k in d if k == "b"]
for k in keys_to_remove:
    del d[k]

# 方法 3:创建新字典(函数式风格)
d = {k: v for k, v in d.iteritems() if k != "b"}

按值排序

字典本身是无序的,但可以用 sorted() 按值排序:

scores = {"Alice": 85, "Bob": 92, "Charlie": 78}

# 按值升序
for name, score in sorted(scores.iteritems(), key=lambda x: x[1]):
    print name, score

# 输出:
# Charlie 78
# Alice 85
# Bob 92

# 按值降序
for name, score in sorted(scores.iteritems(), key=lambda x: x[1], reverse=True):
    print name, score

sorted() 接受一个可迭代对象,返回排序后的列表。key 参数指定排序依据,lambda x: x[1] 表示按元组的第二个元素(值)排序。

按键排序

d = {"banana": 3, "apple": 4, "pear": 1, "orange": 2}

# 按键字母顺序
for key in sorted(d):
    print key, d[key]

# 输出:
# apple 4
# banana 3
# orange 2
# pear 1

合并两个字典

d1 = {"a": 1, "b": 2}
d2 = {"b": 20, "c": 3}

# 方法 1:update(修改 d1)
d1.update(d2)
print d1            # {'a': 1, 'c': 3, 'b': 20}

# 方法 2:创建新字典(不修改原字典)
merged = dict(d1, **d2)
# 或
merged = d1.copy()
merged.update(d2)

默认值模式

遍历字典时处理缺失键的常见模式:

# 模式 1:get() 提供默认值
for key in ["a", "b", "z"]:
    value = d.get(key, 0)
    print key, value

# 模式 2:setdefault() 初始化
for key in ["a", "b", "z"]:
    d.setdefault(key, 0)
    d[key] += 1

# 模式 3:collections.defaultdict(更优雅)
from collections import defaultdict
counts = defaultdict(int)
counts["a"] += 1    # 自动初始化为 0

反转字典

交换键和值:

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

# 简单反转(值必须唯一)
reversed_d = {v: k for k, v in d.iteritems()}
print reversed_d    # {1: 'a', 2: 'b', 3: 'c'}

# 值不唯一时,分组
from collections import defaultdict
reversed_d = defaultdict(list)
for k, v in d.iteritems():
    reversed_d[v].append(k)
上一页
字典方法
下一页
集合