Python遍历字典的三种基础方法:keys、values与items

云舒
云舒
发布时间:2026-10-21 | 4人浏览过
原创

在Python开发中,字典(dict)是维护键值对映射关系的核心容器。当我们需要读取或处理字典中的所有数据时,遍历方式的选择直接决定了代码的语义清晰度与执行效率。Python字典原生提供了三种基础视图方法:keys()、values() 与 items(),分别对应“获取键”、“获取值”以及“同时获取键与值”。理解这三种方法的设计目的与行为差异,能够帮助我们在面对不同业务场景时写出既符合规范又高效的代码。

Python遍历字典的三种基础方法:keys、values与items
图 1:Python字典结构与三种视图对象提取的数据层级示意图

方法一:仅提取键名 —— 使用 keys() 或直接迭代

当业务逻辑只需要关心字典包含哪些键,或者需要对键名进行过滤和匹配时,可以使用 keys() 方法。在Python中,调用 d.keys() 会返回一个名为 dict_keys 的动态视图对象。该对象支持迭代协议,可以直接放在 for 循环中逐项取出每一个键。

标准使用示例

# 定义示例配置字典
server_config = {
    "host": "127.0.0.1",
    "port": 8080,
    "debug": True,
    "timeout": 30
}

# 显式使用 keys() 遍历
print("--- 显式调用 keys() ---")
for key in server_config.keys():
    print(f"配置项名称: {key}")

# 示例输出:
# 配置项名称: host
# 配置项名称: port
# 配置项名称: debug
# 配置项名称: timeout

隐式遍历与 keys() 的关系

在Python中,直接对字典对象本身进行 for 循环(即 for key in server_config:),默认行为与调用 server_config.keys() 完全一致。Python内部为字典实现的 __iter__() 方法默认返回的就是键迭代器。

在日常编码中,如果意图非常明确,编写 for key in d: 更加简洁,也是PEP 8推荐的Pythonic风格;而显式写出 for key in d.keys(): 则能够更直观地向其他阅读代码的开发者表明“此处只关心键”。

方法二:仅提取数值 —— 使用 values()

如果业务目标只关注具体的数据内容,完全不需要知道这些数据由哪个键对应,那么应当使用 values() 方法。调用 d.values() 返回 dict_values 视图对象,包含字典中所有的值。

标准使用示例

# 统计学生各科目成绩
exam_scores = {
    "math": 92,
    "english": 88,
    "physics": 95,
    "chemistry": 85
}

# 使用 values() 遍历数值并累加
total_score = 0
for score in exam_scores.values():
    total_score += score
    print(f"登记单科分数: {score}")

print(f"总分为: {total_score}")

# 示例输出:
# 登记单科分数: 92
# 登记单科分数: 88
# 登记单科分数: 95
# 登记单科分数: 85
# 总分为: 360
特性说明:字典的“键”具有唯一性,但“值”可以重复。使用 values() 遍历时,若字典中存在多个键拥有相同的值,这些值会按照键的插入顺序全部完整产出,不会自动去重。如果需要不重复的数值集合,可以显式包装为集合:set(exam_scores.values())。
Python遍历字典的三种基础方法:keys、values与items
图 2:字典遍历从需求分析到语法模式选择的操作流程图

方法三:同时提取键与值 —— 使用 items() 与元组解包

在实际业务中,最频繁的需求是同时使用键与值(例如日志打印、格式化输出、字典重构)。此时最推荐的方法是 items()。调用 d.items() 会返回 dict_items 视图,其中的每个元素都是一个 (key, value) 的二元元组。

元组解包(Tuple Unpacking)的标准写法

Python支持在 for 循环中直接对元组进行解包赋值,语法非常直观:

# 用户配置字典
user_profile = {
    "username": "coder_99",
    "email": "coder@example.com",
    "status": "active"
}

# 使用 items() 并在循环头直接解包为 key 和 value
for field, val in user_profile.items():
    print(f"字段 [{field}] 的取值为: {val}")

# 示例输出:
# 字段 [username] 的取值为: coder_99
# 字段 [email] 的取值为: coder@example.com
# 字段 [status] 的取值为: active

反面模式对比:为什么不建议通过键反复查值

初学者容易写出以下代码:

# 不推荐的冗余写法
for key in user_profile:
    val = user_profile[key]  # 冗余操作:每一次循环都执行一次哈希查找
    print(f"{key}: {val}")

这种写法虽然结果正确,但存在两个明显不足:

1. 多余的哈希开销:每次循环都需要在底层哈希表中重新根据 key 寻找对应的桶并取出值;而 items() 在底层迭代遍历字典内部表结构时,直接将键和值的指针打包返回,效率更高。

2. 语义不够直接:使用 items() 明确声明了“我需要同时使用键与值”,增强了代码的可读性与规范性。

Python遍历字典的三种基础方法:keys、values与items
图 3:三种字典遍历方法在元素类型、性能代价与业务场景的矩阵对照

关键差异与注意事项

1. 视图对象的动态联动机制

在Python 3中,keys()、values() 与 items() 返回的不是独立的列表副本,而是字典的视图(Dictionary View Objects)。视图对象具有动态性:当字典内部的数据发生修改时,之前获取的视图对象会自动反映这些修改,且创建视图不需要进行完整的内存复制,其构造开销为 O(1)。

重点避坑:遍历期间严禁改变字典大小!
如果在遍历 keys()、values() 或 items() 的循环体内部,执行了向字典添加新键(d[new_key] = val)或删除键(del d[key] / pop())的操作,Python解释器会立即抛出异常:
RuntimeError: dictionary changed size during iteration。

2. 如何安全地在遍历中删除或修改键

如果业务确实需要根据某些条件过滤并清理原字典,不能直接在迭代过程中调用 del。正确的处理模式有两种:

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

# 解决方案一:先转换为静态列表快照,再进行遍历删除
for k in list(data.keys()):
    if data[k] % 2 == 0:
        del data[k]

print("清理偶数后的字典:", data)
# 示例输出:清理偶数后的字典: {'a': 1, 'c': 3}

# 解决方案二(更推荐):使用字典推导式生成符合条件的新字典
data = {"a": 1, "b": 2, "c": 3, "d": 4}
filtered_data = {k: v for k, v in data.items() if v % 2 != 0}
print("推导式过滤后的字典:", filtered_data)
# 示例输出:推导式过滤后的字典: {'a': 1, 'c': 3}
Python遍历字典的三种基础方法:keys、values与items
图 4:字典遍历快速选型决策树与避免运行时报错的实践准则

总结

Python字典遍历的核心在于根据处理需求精准选择视图方法:

• 只要键名:直接使用 for k in d: 或显式使用 for k in d.keys():,逻辑轻量明了;

• 只要数值:使用 for v in d.values():,直达数据本身,适合数据统计与聚合;

• 键值兼备:使用 for k, v in d.items(): 结合元组解包,消除不必要的二次寻址,代码可读性最高。

掌握这三种方法的特点及动态视图的约束规则,能够帮助你在日常编码中写出更加健壮、高效且具备良好可维护性的Python程序。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表