当前位置: 首页 > news >正文

Python 字典(dict)的高级用法与技巧

今天我们继续深入讲解 Python 字典的 高级用法与技巧,包括:

  1. defaultdict:带默认值的字典
  2. Counter:快速统计工具
  3. 字典排序:按键或值排序
  4. 合并字典(传统方式和 Python 3.9+ 新语法)
  5. 嵌套字典的安全访问

collections.defaultdict:自动创建默认值

来自 collections 模块的 defaultdict 是一种可以在访问不存在的 key 时自动生成默认值的字典。

使用方式:

from collections import defaultdict# 默认值为 int(),即 0
counts = defaultdict(int)words = ['apple', 'banana', 'apple']
for word in words:counts[word] += 1print(counts)  # {'apple': 2, 'banana': 1}

常见场景:

  • 统计频率(用 int 作为默认工厂)
  • 创建嵌套字典(用 dictdefaultdict
  • 列表自动追加(用 list
# 嵌套字典
tree = defaultdict(lambda: defaultdict(int))
tree["fruit"]["apple"] += 1# 值为列表
group = defaultdict(list)
group["math"].append("Alice")
group["math"].append("Bob")

collections.Counter:频率统计神器

用于快速统计元素出现次数。

from collections import Counterdata = ['apple', 'banana', 'apple', 'orange', 'banana']
count = Counter(data)print(count)          # Counter({'apple': 2, 'banana': 2, 'orange': 1})
print(count['apple']) # 2

方法:

count.most_common(2)     # [('apple', 2), ('banana', 2)]
count.update(['apple'])  # 再加一个 'apple'

字典排序(按 key / value)

字典本身是无序(3.6 之后有序表现,但不用于排序),你可以使用 sorted() 对字典内容排序:

按值排序:

d = {'a': 3, 'b': 1, 'c': 2}
sorted_items = sorted(d.items(), key=lambda item: item[1])print(dict(sorted_items))  # {'b': 1, 'c': 2, 'a': 3}

按键排序:

sorted_by_key = dict(sorted(d.items(), key=lambda x: x[0]))

合并字典的方法

Python < 3.9:

a = {'x': 1, 'y': 2}
b = {'y': 3, 'z': 4}
merged = {**a, **b}  # 若键冲突,b 会覆盖 a

Python ≥ 3.9 新写法:

a = {'x': 1}
b = {'y': 2}
c = a | b  # 合并

安全访问嵌套字典

防止 KeyError 的方式:

person = {"name": "Alice","address": {"city": "Beijing","code": 10001}
}# 安全访问嵌套值
city = person.get("address", {}).get("city", "Unknown")

补充:创建嵌套字典的 defaultdict 技巧

nested = defaultdict(lambda: defaultdict(list))
nested["class"]["math"].append("Alice")

下面通过两个实战小项目,深入掌握 Counterdefaultdict 的应用技巧:


项目一:使用 Counter 实现词频统计器(英文)

目标:读取一段文本,统计其中每个单词出现的次数,并输出出现频率最高的前 N 个单词。

示例代码:

from collections import Counter
import redef word_count(text, top_n=10):# 使用正则将文本中的单词提取出来(忽略大小写)words = re.findall(r'\b\w+\b', text.lower())# 用 Counter 统计频率counter = Counter(words)# 输出前 N 个高频词for word, freq in counter.most_common(top_n):print(f"{word}: {freq}")# 示例用法
text = """
Natural language processing (NLP) is a subfield of linguistics, computer science, and artificial intelligence 
concerned with the interactions between computers and human language.
"""word_count(text, top_n=5)

输出示例:

and: 3
language: 2
natural: 1
processing: 1
nlp: 1

项目二:使用 defaultdict 构建嵌套 JSON-like 数据结构

目标:自动构建一个部门 -> 课程 -> 学生列表 的嵌套结构。

示例代码:

from collections import defaultdict
import json# 三层嵌套 defaultdict
school = defaultdict(lambda: defaultdict(list))# 添加数据
school["Engineering"]["Math"].append("Alice")
school["Engineering"]["Math"].append("Bob")
school["Engineering"]["Physics"].append("Charlie")
school["Arts"]["Literature"].append("Daisy")# 可转为普通 dict 方便输出
def convert(d):if isinstance(d, defaultdict):d = {k: convert(v) for k, v in d.items()}return d# 打印嵌套 JSON 样式
print(json.dumps(convert(school), indent=2))

输出示例:

{"Engineering": {"Math": ["Alice","Bob"],"Physics": ["Charlie"]},"Arts": {"Literature": ["Daisy"]}
}

总结

工具用途优势
Counter快速统计元素频率简洁、可排序、可更新
defaultdict自动初始化默认值,构建嵌套结构不必手动判断 key 是否存在
http://www.xdnf.cn/news/897175.html

相关文章:

  • 跨平台游戏引擎 Axmol-2.6.1 发布
  • [论文阅读] 人工智能 | 利用负信号蒸馏:用REDI框架提升LLM推理能力
  • 使用vsftpd搭建FTP服务器(TLS/SSL显式加密)
  • 大模型与 NLP、Transformer 架构
  • vue3子组件获取并修改父组件的值
  • TTT讲师认证题目学习记录
  • C++算法训练营 Day10 栈与队列(1)
  • Java学习——正则表达式
  • PHP语言核心技术全景解析
  • 双碳时代,能源调度的难题正从“发电侧”转向“企业侧”
  • MySQL体系架构解析(二):MySQL目录与启动配置全解析
  • React从基础入门到高级实战:React 实战项目 - 项目三:实时聊天应用
  • Linux容器篇、第二章_01Ubuntu22 环境下 KubeSphere 容器平台高可用搭建全流程
  • 悲观锁和乐观锁
  • 数据库SQLite基础
  • 《完全背包》题集
  • 天机学堂(学习计划和进度)
  • TDengine 开发指南——无模式写入
  • vue-20(Vuex 状态管理的最佳实践)
  • 如何配置nginx解决前端跨域请求问题
  • Nuxt.js 中的路由配置详解
  • (转)什么是DockerCompose?它有什么作用?
  • Ubuntu 基于sdl 音频学习的基础代码
  • 市面上哪款AI开源软件做ppt最好?
  • wordpress+woocommerce电商平台搭建方案的优势分析
  • 1.3 古典概型和几何概型
  • MySQL安装与配置详细讲解
  • vue3报错:SyntaxError: Identifier ‘__vite__injectQuery‘ has already been declared
  • PostgreSQL 技术峰会,聚焦国产生态与前沿技术
  • CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)