查看: 100|回复: 1

Python字典遍历核心方法:keys/values/items视图及最佳实践

[复制链接]
发表于 3 小时前 | 显示全部楼层 |阅读模式
在Python日常编程中,字典的遍历是最频繁的操作之一。无论是处理API返回的JSON数据、统计用户行为还是构建报表,高效遍历字典都是基本功。Python 3为字典提供了三种视图对象:keys()、values()和items(),每种都有独特的用途和技巧。本文将从基本遍历出发,深入探讨视图的动态性、集合操作、高级遍历技巧以及性能对比,最后通过一个实战案例展示完整的数据处理流水线。
  1. d = {'name': '小明', 'age': 25, 'city': '北京'}
  2. # 默认迭代遍历的是键,最简洁
  3. for key in d:
  4.     print(key)
  5. # 显式调用keys()效果相同
  6. for key in d.keys():
  7.     print(key)
  8. # 遍历时访问值
  9. for key in d:
  10.     print(f'{key} = {d[key]}')
复制代码

keys()视图支持集合操作,例如交集、并集、差集和对称差。利用d1.keys() & d2.keys()可以快速找出两个字典的公共键。
  1. d1 = {'name': '小明', 'age': 25, 'city': '北京'}
  2. d2 = {'name': '小红', 'age': 23, 'job': '设计师'}
  3. common_keys = d1.keys() & d2.keys()
  4. print(common_keys)  # {'name', 'age'}
复制代码

keys()视图是动态的,修改字典后视图自动更新。但注意不能在遍历视图时修改字典大小(增减键),否则可能触发RuntimeError。如果需要边遍历边修改,应先将键转化为列表。
  1. d = {'a': 1, 'b': 2, 'c': 3}
  2. for key in list(d.keys()):
  3.     d[f'new_{key}'] = 1
  4. print(d)  # 安全修改
复制代码

values()视图适合做值的聚合计算,例如求和、平均值、最大最小值。成员检查是O(n)的,因为值可能重复。
  1. scores = {'小明': 85, '小红': 92, '小刚': 78, '小李': 95}
  2. total = sum(scores.values())
  3. print(total)  # 350
  4. avg = total / len(scores)
  5. print(avg)  # 87.5
复制代码

values()视图通常不支持集合操作,因为值可能不可哈希或重复。需要集合操作时可以先转为set。注意in d检查的是键而不是值,容易混淆。

items()视图是最常用的遍历方式,同时获取键和值。它也支持集合操作,可以用&找出两个字典中键值完全相同的项。还可以结合sorted()实现按键或按值排序。
  1. scores = {'小明': 85, '小红': 92, '小刚': 78, '小李': 95, '小王': 88}
  2. # 按值升序
  3. sorted_by_value = dict(sorted(scores.items(), key=lambda x: x[1]))
  4. # 按值降序取前三
  5. top3 = dict(sorted(scores.items(), key=lambda x: x[1], reverse=True)[:3])
复制代码

高级技巧方面,第一个黄金法则:不要在遍历字典时修改其结构(增减键)。如果只需要修改值,可以直接遍历键并修改d[key]。如果需要增删键,先收集到列表再操作,或者遍历list(d.keys())创建快照。

嵌套字典可以用递归遍历。
  1. def traverse_dict(d, path=''):
  2.     for key, value in d.items():
  3.         current_path = f'{path}.{key}' if path else key
  4.         if isinstance(value, dict):
  5.             traverse_dict(value, current_path)
  6.         else:
  7.             print(f'{current_path} = {value}')
复制代码

多字典并行遍历时,可以利用keys()视图的并集或交集。

性能对比测试(100万条数据)表明,for key in d和for key in d.keys()几乎一样快,for k,v in d.items()稍慢但更常用,for key in d + d[key]最慢,因为两次哈希操作。
  1. import time
  2. d = {f'key_{i}': i for i in range(1000000)}
  3. start = time.perf_counter()
  4. for key in d:
  5.     _ = key
  6. t1 = time.perf_counter() - start
  7. # 其他方式类似
复制代码

最佳实践原则:
- 只需要键:for key in d
- 只需要值:for v in d.values(),甚至可以用sum(d.values())等聚合函数
- 同时需要键和值:for k, v in d.items()
- 要修改字典值:直接遍历键并赋值
- 要修改字典结构:遍历list(d.keys())或列表推导式收集后再操作

实战:问卷调查结果分析。
  1. def analyze_survey(responses):
  2.     city_counts = {}
  3.     age_groups = {'青年(<=30)': 0, '中年(31-50)': 0, '老年(>50)': 0}
  4.     total_score = 0
  5.     scores_list = []
  6.     for r in responses:
  7.         city = r.get('city', '未知')
  8.         city_counts[city] = city_counts.get(city, 0) + 1
  9.         age = r.get('age', 0)
  10.         if age <= 30:
  11.             age_groups['青年(<=30)'] += 1
  12.         elif age <= 50:
  13.             age_groups['中年(31-50)'] += 1
  14.         else:
  15.             age_groups['老年(>50)'] += 1
  16.         score = r.get('score', 0)
  17.         total_score += score
  18.         scores_list.append(score)
  19.     avg_score = total_score / len(responses) if responses else 0
  20.     scores_list.sort()
  21.     return {
  22.         'total': len(responses),
  23.         'city_distribution': city_counts,
  24.         'age_distribution': age_groups,
  25.         'avg_score': round(avg_score, 1),
  26.         'median_score': scores_list[len(scores_list)//2] if scores_list else 0,
  27.         'highest_score': scores_list[-1] if scores_list else 0,
  28.         'lowest_score': scores_list[0] if scores_list else 0,
  29.     }
  30. survey_data = [
  31.     {'name': '小明', 'age': 25, 'score': 85, 'city': '北京'},
  32.     {'name': '小红', 'age': 32, 'score': 92, 'city': '上海'},
  33.     {'name': '小刚', 'age': 28, 'score': 78, 'city': '北京'},
  34.     {'name': '小李', 'age': 45, 'score': 95, 'city': '广州'},
  35.     {'name': '小王', 'age': 55, 'score': 88, 'city': '上海'},
  36. ]
  37. result = analyze_survey(survey_data)
  38. for key, value in result.items():
  39.     print(f'{key}: {value}')
复制代码

总结:keys()视图支持集合操作且动态,适合键的批量处理;values()适合值的聚合计算;items()是遍历的主力。牢记不要在遍历时修改字典结构,善用视图的动态性和集合操作,能极大提升代码效率。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python字典遍历核心方法:keys/values/items视图及最佳实践

楼主总结得真全面!keys/values/items 这三种视图的动态性确实是 Python 3 的亮点,特别是 keys() 支持集合操作在生产中很实用,比如对比两个配置字典的差异。 我补充一点:在实战代码那里有个小疏忽——`city_counts = city_counts.get(city, 0) + 1` 这行每次都会把字典重新赋值为一个整数,导致后续 `city_counts` 会报错。应该改成 `city_counts = city_counts.get(city, 0) + 1` 或者用 `defaultdict(int)`。另外 Python 3.7+ 的字典已经保持插入顺序,遍历时按键顺序稳定的特性也可以利用一下,比如用 `dict.fromkeys` 保留顺序去重。感谢楼主分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-14 13:04 , Processed in 0.030982 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部