一 使用字符串这一章节内容由于之前笔记网络出现问题未保存就不再次写了二字典1字典的用途字典dict是Python中非常重要的一种数据结构它的设计灵感来源于我们日常使用的字典——通过“单词”键快速查找“含义”值。适用场景存储棋盘状态键为坐标元组值为棋子信息记录文件修改时间键为文件名值为时间戳实现电话簿、地址簿等快速查找功能。对比列表列表适合按顺序存储和访问通过下标索引字典通过键来访问更直观、更高效示例#列表 names [Alice, Beth, Cecil] numbers [2341, 9102, 3158] print(numbers[names.index(Cecil)]) # 输出 3158 #字典 phonebook {Alice: 2341, Beth: 9102, Cecil: 3158} print(phonebook[Cecil]) # 输出 31582创建和使用字典1基本语法字典用花括号{}表示。每个项由键: 值组成项之间用逗号分隔。空字典{}phonebook {Alice: 2341, Beth: 9102, Cecil: 3258}注意键必须唯一但是值可以重复2使用dict()函数创建字典# 从键-值对序列创建 items [(name, Gumby), (age, 42)] d dict(items) print(d) # {name: Gumby, age: 42} # 使用关键字参数 d dict(nameGumby, age42) print(d) # {name: Gumby, age: 42} # 创建空字典 d dict()3基本字典操作4字典与列表的区别示例#字典自动添加新建 x {} x[42] Foobar print(x) # {42: Foobar} #列表会报错 x [] x[42] Foobar # IndexError效率提示检查字典是否包含某个键比列表检查是否包含某个值要快得多尤其在数据量较大时5综合示例简单的电话数据库# 数据库每个人是一个字典包含电话和地址 people { Alice: {phone: 2341, addr: Foo drive 23}, Beth: {phone: 9102, addr: Bar street 42}, Cecil: {phone: 3158, addr: Baz avenue 90} } # 标签说明 labels {phone: phone number, addr: address} name input(Name: ) request input(Phone number (p) or address (a)? ) # 确定查询的键 if request p: key phone elif request a: key addr else: key None # 输出结果 if key and name in people: print(f{name}s {labels[key]} is {people[name][key]}) else: print(Not found.)运行结果示例Name: Beth Phone number (p) or address (a)? p Beths phone number is 91023将字符串格式设置功能用于字典Python 的字符串格式化方法format()和format_map()支持从字典中提取值来填充字符串模板这在生成动态文本如报告、HTML页面、邮件模板等时非常方便。3,1 基本用法format_map()使用format_map()方法时传入一个字典字符串中的占位符字段名会自动匹配字典的键。phonebook {Alice: 2341, Beth: 9102, Cecil: 3158} # 直接用字典中的键作为占位符 msg Cecils phone number is {Cecil}..format_map(phonebook) print(msg) # Cecils phone number is 3158.注意占位符{Cecil}必须与字典中的键名完全一致否则会报错KeyError3,2 与format的对比3,3 实用场景模板渲染字典格式化非常适合用来填充模板字符串例如生成 HTML 页面、邮件内容、配置文件等.# HTML 模板 template html headtitle{title}/title/head body h1{title}/h1 p{text}/p /body /html # 数据字典 data { title: My Home Page, text: Welcome to my home page! } # 渲染模板 print(template.format_map(data))输出效果html headtitleMy Home Page/title/head body h1My Home Page/h1 pWelcome to my home page!/p /body /html3,4 format()配合**解包除了format_map()你还可以使用**将字典解包为关键字参数效果相同print(template.format(**data))两种方式的选择format_map(d)更直接性能略优省去解包过程。format(**d)更通用也适用于其他需要关键字参数的场景3,5 注意事项键必须存在占位符中用到的所有键必须在字典中有对应的值否则抛出KeyError。支持嵌套访问字典中的值也可以是字典或对象但占位符本身不支持直接写{a.b}这样的嵌套格式如需嵌套可结合format的自定义格式化器但一般较少使用。键名规范占位符中的键名应遵循变量命名规则字母、数字、下划线不以数字开4,字典方法4,1clear()—— 清空字典删除字典中所有键值对原地修改返回None。d {name: Gumby, age: 42} d.clear() print(d) # {}注意clear()会修改原字典本身。如果只是d {}原字典若被其他变量引用则不会被清空。x {key: value} y x x.clear() print(y) # {} —— y 也被清空了4,2copy()—— 浅复制返回原字典的浅副本.x {username: admin, machines: [foo, bar]} y x.copy() y[username] mlh # 替换顶层值不影响 x y[machines].remove(bar) # 修改可变值列表影响 x print(x) # {username: admin, machines: [foo]}浅复制的特点顶层键值对是独立副本但如果值是可变对象列表、字典等修改它会同时影响原字典.解决方案深复制from copy import deepcopy d {names: [Alfred, Bertrand]} dc deepcopy(d) d[names].append(Clive) print(dc) # {names: [Alfred, Bertrand]} —— 不受影响4,3fromkeys()—— 创建带默认值的新字典从键列表创建字典值默认为None。dict.fromkeys([name, age]) # {name: None, age: None}4,4 get()—— 安全获取值推荐访问键时若不存在不会报错而是返回None或指定的默认值。d {} print(d.get(name)) # None print(d.get(name, N/A)) # N/A4,5items()—— 返回键-值对视图返回一个视图对象包含所有(key, value)元组.d {title: Python, url: http://python.org} for key, value in d.items(): print(key, value)视图是动态的修改字典后视图会自动更新。it d.items() d[spam] 0 print((spam, 0) in it) # True4,6keys()—— 返回所有键的视图d {x: 1, y: 2} print(d.keys()) # dict_keys([x, y])4,7pop()—— 弹出指定键的值删除指定键并返回其值。d {x: 1, y: 2} val d.pop(x) print(val) # 1 print(d) # {y: 2}若键不存在会报错建议配合默认值使用d.pop(z, None) # 安全删除4,8 popitem()—— 随机弹出一项删除并返回一个任意键值对Python 3.7 返回最后插入的一项d {a: 1, b: 2} print(d.popitem()) # (b, 2)4,9setdefault()—— 获取值若不存在则设置默认值与get()类似但键不存在时会自动写入默认值.d {} d.setdefault(name, N/A) # 返回 N/A且 d[name] N/A print(d) # {name: N/A}若键已存在则返回原值不修改.4,10update()—— 合并/更新字典用另一个字典或键值对序列更新当前字典.d {title: Python Web Site} x {title: Python Language Website, url: http://python.org} d.update(x) print(d) # {title: Python Language Website, url: http://python.org}也支持关键字参数d.update(a1, b2)4,11 values() —— 返回所有值的视图d {a: 1, b: 2, c: 1} print(d.values()) # dict_values([1, 2, 1])值可以重复不能直接通过值反查键.总结字典是 Python 中最常用的数据结构之一尤其在神经网络建模中存储超参数配置管理模型状态作为缓存或中间结果容器