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

Python基础之字典(Dictionary)全面指南

字典(Dictionary)是 Python 中一种强大的键值对存储结构,具有极高的灵活性和查找效率。本文将详细讲解字典的定义、特性、常用操作、深浅拷贝及应用场景,帮助你熟练掌握字典的使用技巧。

一、字典的基本定义与特性

1. 字典的格式

字典以键值对(key-value) 形式存储数据,格式为:
字典名 = {键1: 值1, 键2: 值2, ...}

  • 键(key)与值(value)之间用冒号 : 分隔
  • 键值对之间用逗号 , 分隔
  • 整体包裹在大括号 {} 中
  • 键必须是不可变类型(如字符串、数字、元组),且具有唯一性;值可以是任意数据类型(包括列表、字典等)
# 定义字典
dic = {'name': 'bingbing', 'age': 18, 'hobbies': ['reading', 'coding']}
print(type(dic))  # <class 'dict'># 键的唯一性:重复键会被覆盖
dic2 = {'name': 'bingbing', 'name': 'susu'}
print(dic2)  # {'name': 'susu'}(后定义的键值对覆盖前面的)

 

2. 字典的核心特性

  • 无序性:Python 3.7 之前字典是无序的,3.7 及以后保证插入顺序(但仍不支持下标访问)
  • 可变性:支持动态添加、修改、删除键值对
  • 高效查找:通过键查找值的时间复杂度为 O (1),远快于列表的遍历查找

二、字典的常用操作

1. 访问元素(查询)

字典不支持下标访问,需通过键名获取对应值,主要有两种方式:

方式说明示例
字典名[键名]直接访问,键不存在则报错dic['age'] → 18
字典名.get(键名, 默认值)安全访问,键不存在返回 None 或指定默认值dic.get('tel', '未知') → ' 未知'
dic = {'name': 'bingbing', 'age': 18}# 直接访问
print(dic['name'])  # bingbing
# print(dic['sex'])  # 报错:KeyError(键不存在)# get() 方法访问
print(dic.get('age'))        # 18
print(dic.get('tel'))        # None(默认返回)
print(dic.get('tel', '无'))  # 无(指定默认值)

3. 删除元素

字典提供多种删除操作,适用于不同场景:

方法说明示例
del 字典名[键名]删除指定键值对,键不存在则报错del dic['age']
del 字典名删除整个字典,后续无法访问del dic
字典名.clear()清空字典内容,保留空字典对象dic.clear() → {}
字典名.pop(键名)删除指定键值对并返回对应值,键不存在则报错dic.pop('name') → 'bingbing'
字典名.popitem()Python 3.7+ 中删除最后一个键值对并返回该键值对(元组形式)dic.popitem() → ('tel', '12345678')
dic = {'name': 'bingbing', 'age': 18, 'tel': '12345678'}# pop() 删除并返回值
age = dic.pop('age')
print(age)   # 18
print(dic)   # {'name': 'bingbing', 'tel': '12345678'}# popitem() 删除最后一个键值对
last_item = dic.popitem()
print(last_item)  # ('tel', '12345678')
print(dic)        # {'name': 'bingbing'}# clear() 清空字典
dic.clear()
print(dic)  # {}

4. 其他常用操作

  • 获取长度len(字典名) 返回键值对的数量
  • 获取所有键keys() 返回键的集合(可迭代)
  • 获取所有值values() 返回值的集合(可迭代)
  • 获取所有键值对items() 返回键值对元组的集合(可迭代)
dic = {'name': 'bingbing', 'age': 18, 'tel': '123'}# 长度
print(len(dic))  # 3# 所有键
print(dic.keys())  # dict_keys(['name', 'age', 'tel'])# 所有值
for value in dic.values():print(value)  # 依次输出:bingbing、18、123# 所有键值对(常用于遍历)
for key, value in dic.items():print(f"{key}: {value}")
# 输出:
# name: bingbing
# age: 18
# tel: 123

三、字典的拷贝:浅拷贝与深拷贝

字典的拷贝涉及到可变对象和不可变对象的处理差异,需注意深浅拷贝的区别:

1. 浅拷贝(copy() 方法)

  • 不可变对象(如字符串、数字):拷贝值的副本,修改互不影响
  • 可变对象(如列表、字典):仅拷贝引用(共享内存地址),修改会相互影响
original = {'name': 'Alice',  # 不可变对象(字符串)'scores': [85, 90],  # 可变对象(列表)'details': {'city': 'New York'}  # 可变对象(字典)
}# 浅拷贝
shallow_copy = original.copy()# 修改不可变对象(互不影响)
shallow_copy['name'] = 'zhangsan'
print(original['name'])  # Alice(原字典不变)
print(shallow_copy['name'])  # zhangsan(拷贝字典变化)# 修改可变对象(相互影响)
shallow_copy['scores'].append(95)
print(original['scores'])  # [85, 90, 95](原字典被影响)
print(shallow_copy['scores'])  # [85, 90, 95](拷贝字典变化)shallow_copy['details']['city'] = 'Shanghai'
print(original['details'])  # {'city': 'Shanghai'}(原字典被影响)

2. 深拷贝(copy.deepcopy()

通过 copy 模块的 deepcopy() 实现,完全拷贝所有层级的对象(包括可变对象),原字典与拷贝字典完全独立,修改互不影响。

import copyoriginal = {'scores': [85, 90],'details': {'city': 'New York'}
}# 深拷贝
deep_copy = copy.deepcopy(original)# 修改可变对象(互不影响)
deep_copy['scores'].append(95)
deep_copy['details']['city'] = 'Shanghai'print(original['scores'])  # [85, 90](原字典不变)
print(deep_copy['scores'])  # [85, 90, 95](拷贝字典变化)print(original['details'])  # {'city': 'New York'}(原字典不变)
print(deep_copy['details'])  # {'city': 'Shanghai'}(拷贝字典变化)

 

四、字典的应用场景

字典凭借键值对的特性,在以下场景中应用广泛:

1. 存储结构化数据

适合表示具有多个属性的实体(如用户信息、商品详情等)。

user = {'id': 1001,'name': 'bingbing','info': {'age': 18, 'gender': 'female'}
}

2. 高效查找与映射

用于需要通过唯一标识快速定位数据的场景(如缓存、索引)。

# 用字典实现快速查询学生成绩
score_map = {'Alice': 90, 'Bob': 85, 'Cindy': 95}
print(score_map.get('Bob'))  # 85(O(1) 时间复杂度)

3. 配置参数存储

适合存储程序的配置信息(如数据库连接参数)。

db_config = {'host': 'localhost','port': 3306,'user': 'root','password': '123456'
}

4. 计数与统计

通过键记录对象,值记录数量,实现高效计数。

# 统计字符串中字符出现次数
s = 'abracadabra'
count = {}
for char in s:count[char] = count.get(char, 0) + 1
print(count)  # {'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1}

五、补充:字典推导式

与列表推导式类似,字典推导式可快速创建字典,格式为:
{键表达式: 值表达式 for 变量 in 可迭代对象 if 条件}

# 示例1:创建值为键的平方的字典
square = {i: i**2 for i in range(1, 6)}
print(square)  # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}# 示例2:筛选值为偶数的键值对
original = {'a': 2, 'b': 3, 'c': 4, 'd': 5}
even_dict = {k: v for k, v in original.items() if v % 2 == 0}
print(even_dict)  # {'a': 2, 'c': 4}

总结

字典作为 Python 中最灵活的数据结构之一,其键值对存储方式和高效查找特性使其在各类场景中不可或缺。本文核心要点:

  • 字典以键值对存储,键唯一且不可变,值可任意类型
  • 支持增删改查操作,get() 方法可安全访问键值
  • 浅拷贝对可变对象共享引用,深拷贝完全独立
  • 适合存储结构化数据、高效查找、配置参数等场景
http://www.dtcms.com/a/267739.html

相关文章:

  • 南山科技园的步行
  • Qt项目锻炼——TODO清单(三)
  • 【论文笔记】OctoThinker:突破 Llama 推理瓶颈的中期训练范式
  • 乌邦图(20.04)添加中文拼音(中文输入法)
  • 实现电池储能装置的双向DCDC
  • Qt项目锻炼——TODO清单(二)
  • jmm--volatile
  • 前端面试专栏-算法篇:18. 查找算法(二分查找、哈希查找)
  • vue3 el-input el-select 非空校验
  • 大数据学习2:HIve
  • Linux进程管理:从基础到实战
  • Qt Ribbon效果界面
  • QT6 源(154)模型视图架构里的列表视图 QListView:先学习属性部分,
  • 认识Redis
  • Chat Model API
  • 60天python训练营打卡day52
  • 运算方法和运算器补充
  • 如何录制带备注的演示文稿(LaTex Beamer + Pympress)
  • Codeforces Round 919 (Div. 2) D. Array Repetition(分块,1900)
  • 【深圳大学机器学习】实验一:PCA算法
  • 【ACL系列论文写作指北15-如何进行reveiw】-公平、公正、公开
  • 大数据学习1:Hadoop单机版环境搭建
  • Redis 哨兵模式部署--docker版本
  • C++面试-auto,auto,auto 的区别
  • 【ESP32】2.多任务处理
  • 相机位姿估计
  • 使用接口测试工具类Postman和浏览器的差异
  • C++ 语言特性31 - 协程介绍(2)
  • 用 Turbo Vision 2 为 Qt 6 控制台应用创建 TUI 字符 MainFrame
  • Redis性能优化