《Python从入门到实践》读书笔记——第六章 字典

1. 一个简单的字典

alien_0 = {'color': 'green', 'points': 5}print(alien_0['color'])
print(alien_0['points'])#字典alien_0存储量外星人的颜色和分数.最后两行代码访问并显示这些信息
green
5

2. 使用字典

在Python中, 字典 是一系列 键值对 . 每个 都与一个值相关联, 你可以使用键来访问相关联的值. 与键相关联的值可以是数、字符串、列表乃至字典. 事实上, 可将任何Python对象用作字典中的值.
在Python中, 字典用放在花括号( {} )中的一系列键值对表示,如前面的示例所示:

alien_0 = {'color': 'green', 'point': 5}

键值对 是两个相关联的值. 指定键时, Python将返回与之相关联的值. 键和值之间用冒号分隔,而键值对之间用逗号分隔. 在字典中, 像存储多少个键值对都可以.
最简单的字典只有一个键值对

alien_0 = {'color': 'green'}

2.1 访问字典中的值

要获取与键相关联的值,可依次指定字典名和放在方括号内的键

alien_0 = {'color': 'green', 'points': 5}new_points = alien_0['points']
print(f"You just earned {new_points} points!")

2.2 添加键值对

alien_0 = {'color': 'green', 'points': 5}
print(alien_0)alien_0['x_position'] = 0
alien_0['y_position'] = 25
print(alien_0)#
{'color': 'green', 'points': 5}
{'color': 'green', 'points': 5, 'x_position': 0, 'y_position': 25}

2.3 先创建一个空字典

alien_0 = {}
alien_0['color'] = 'green'
alien_0['points] = 5print(alien_0)

2.4 修改字典中的值

alien_0 = {'x_position': 0, 'y_position': 25, 'speed': 'media'}
print(f"Original position: {alien_0['x_position']}")# 向右移动外星人
# 根据当前速度确定外星人向右移动多远
if alien_0['speed'] == 'slow':x_increment = 1
elif alien_0['speed'] == 'media':x_increment = 2
else:# 这个外星人的移动速度肯定很快x_increment = 3
# 新位置为旧位置加上移动速度
alien_0['x_position'] = alien_0['x_position'] + x_incrementprint(f"New position: {alien_0['x_position']}")#
Original position: 0
New position: 2

通过修改外星人字典中的值,可改变外星人的行为.例如,要将这个速度中等的外星人变成速度很快的外星人,可添加如下代码行:

alien_0['speed'] = 'fast'

这样,再次运行这些代码运行时, 其中的 if-elif-else 结构将把一个更大的值赋给变量x_increment

2.5 删除键值对

使用 del 语句时, 必须指定字典名和要删除的键

alien_0 = {'color': 'green', 'points': 5}
print(alien_0)del alien_0['points']
print(alien_0)

2.6 由类似对象组成的字典

favorite_laguage = {'jen': 'python','sarah': 'C','edward': 'ruby','phil': 'python',
}language = favorite_laguage['sarah'].title()
print(f"Sarah's favorite language is {language}.")#
Sarah's favorite language is C.

2.7 使用 get() 来访问值

使用放在方括号内的键从字典中获取感兴趣的值时, 可能会引发问题: 如果指定的值不存在就会出错.
这将导致Python显示traceback , 指出存在键值错误(KeyError)
就字典而言,可使用方法 get() 在指定的键不存在时返回一个默认值,从而避免这样的错误.
方法 get() 的第一个参数用于指定键, 是必不可少的; 第二个参数为指定的键不存在时要返回的值,是可选的

alien_0 = {'color': 'green', 'speed': 'slow'}point_value = alien_0.get('point','No point value assigned.')
print(point_value)#
No point value assigned.

如果字典中有键’points’, 将获得与之相关联的值; 如果没有, 将获得指定的默认值.
如果指定的值有可能不存在, 应考虑使用方法 get() ,而不要使用方括号表示法.

调用get()时,如果没有指定第二个参数且指定的键不存在,Python将返回值None. 这个特殊值表示没有相应的值. None并非错误, 而是一个表示所需值不存在的特殊值.

3. 遍历字典

3.1 遍历所有键值对

user_0 = {'username': 'efermi','first': 'enrico','last': 'fermi',
}for key, value in user_0.items():print(f"\nkey:{key}")print(f'value:{value}')#key:username
value:efermikey:first
value:enricokey:last
value:fermi

如L7所示,要遍历字典的for循环,可声明两个变量,用于存储键值对中的键和值.这两个变量可以使用任意名称.下面的代码使用了简单的变量名,这完全可行:

for k, v in user_0.items()

for语句的第二部分包含字典名和方法 items() ,它返回一个键值对列表.接下来,for循环依次将每个键值对赋给指定的两个变量. 在本例中, 使用这两个变量来打印每个键及其相关的值. 第一个函数调用 print() 中的 "\n" 确保在输出每个键值对前都插入一个空行.

在之前的示例 favorite_language.py 中, 字典存储的是不同人的同一种信息. 对于类似这样的字典, 遍历所有的键值对很合适. 如果遍历字典 forite_language, 将得到其中每个人的姓名和喜欢的编程语言. 由于该字典中的键都是人名, 值都是语言, 因此在循环中是使用变量name 和 language, 而不是 key 和 value. 这让人更容易明白循环的作用.

3.2 遍历字典中的所有键

在不需要使用字典中的值时, 方法 keys() 很有用.

#遍历字典 favorite_languages, 并将每个被调查者的名字都打印出来
favorite_languages = {'jen': 'python','sarah': 'c','edward': 'ruby','phil': 'python',
}#for name in favorite_languages:
for name in favorite_languages.keys():print(name.title())#
Jen
Sarah
Edward
Phil

遍历字典时,会默认遍历字典中所有的键,变依次将他们赋值给变量name, 因此使用 for name in favorite_languages: 输出将不变.
显示的使用方法 keys() 可让代码更容易理解,你可以选择这样做,也可以省略它.

在这种循环中,可使用当前键来访问与之相关联的值.

favorite_languages = {'jen': 'python','sarah': 'c','edward': 'ruby','phil': 'python',
}friends = ['phil', 'sarah']
for name in favorite_languages:print(f'Hi {name.title()}.')if name in friends:language = favorite_languages[name].title()print(f"\t {name.title()}, I see you love {language}!")#每个人的名字都会被打印,但只对朋友打印特殊消息
Hi Jen.
Hi Sarah.Sarah, I see you love C!
Hi Edward.
Hi Phil.Phil, I see you love Python!

还可以使用方法 keys() 确定某个人是否接受了调查.

# 确定Erin是否接受了调查
favorite_languages = {'jen': 'python','sarah': 'c','edward': 'ruby','phil': 'python',
}if 'erin' not in favorite_languages.keys():print("Erin, please take our poll!")#
Erin, please take our poll!

方法 keys() 并非只能用于遍历: 实际上, 他 返回一个列表 , 其中包含字典中的所有键. 因此 L9 处的代码行只核实’erin’ 是否包含在这个列表中,所以打印一条消息,邀请她参加调查.

3.3 按特定顺序遍历字典中的所有键

从Python3.7起, 遍历字典时将按插入的顺序返回其中的元素. 不过在有些情况下, 你可能要按与此不同的顺序遍历字典.
要按特定顺序返回元素, 一种办法是在for循环中对返回的键进行排序. 为此, 可使用函数 sorted() 来获得按特定顺序排列的键列表的副本:

favorite_languages = {'jen': 'python','sarah': 'c','edward': 'ruby','phil': 'python',
}for name in sorted(favorite_languages.keys()):print(f"{name.title()}, thank you for taking the poll.")#
Edward, thank you for taking the poll.
Jen, thank you for taking the poll.
Phil, thank you for taking the poll.
Sarah, thank you for taking the poll.

3.4 遍历字典中的所有值

如果主要对字典包含的值感兴趣, 可使用方法 values() 来返回一个值列表, 不包含任何键.

favorite_languages = {'jen': 'python','sarah': 'c','edward': 'ruby','phil': 'python',
}print("The following languages have been mentioned:")
for language in favorite_languages.values():print(language.title())#
The following languages have been mentioned:
Python
C
Ruby
Python

这种做法提取字典中的所有值, 而 没有考虑是否重复 . 为剔除重复项, 可使用集合( set ). 集合 中的每一个元素都必须是独一无二的.

favorite_languages = {'jen': 'python','sarah': 'c','edward': 'ruby','phil': 'python',
}print("The following languages have been mentioned:")
for language in set(favorite_languages.values()):print(language.title())# 通过对包含重复元素的列表调用set(), 可让Python找出列表中独一无二的元素, 并使用这些元素来创建一个集合.
The following languages have been mentioned:
C
Python
Ruby

可使用一对花括号直接创建集合, 并在其中用逗号分隔元素:

>>> languages = {'python', 'ruby', 'python', 'c'}
>>> languages
{'c', 'ruby', 'python'}

集合和字典很容易混淆, 因为它们都是用一对花括号定义的. 当 花括号内没有键值对 时, 定义的很可能是集合. 不同于列表和字典, 集合不会以特定的顺序存储元素.

4. 嵌套

将一系列字典存储在列表中, 或将列表作为值存储在字典中, 这称为 嵌套 . 可以在列表中嵌套字典、 在字典中嵌套列表甚至在字典中嵌套字典.

4.1 字典列表

字典alien_0 包含了一个外星人的各种信息, 但无法存储第二个外星人的信息, 更别说屏幕上全部外星人的信息了. 如何管理成群结队的外星人呢? 一种办法是创建一个外星人列表, 其中每个外星人都是一个字典, 包含有关外星人的各种信息.

alien_0 = {'color': 'green', 'point': 5}
alien_1 = {'color': 'yellow', 'point': 10}
alien_2 = {'color': 'red', 'point': 15}aliens = [alien_0, alien_1, alien_2]
for alien in aliens:print(alien)

更符合现实的情形是, 外星人不止三个, 且每个外星人都是使用代码自动生成的. 在下面的示例中, 使用 range() 生成了30个外星人:

# 创建一个用于存储外星人的空列表
aliens = []# 创建30个绿色的外星人
for alien_number in range(30):new_alien = {'color': 'green', 'point': 5, 'speed': 'slow'}aliens.append(new_alien)# 显示前5个外星人
for alien in aliens[:5]:print(alien)
print('...')# 显示创建了多少个外星人
print(f"Total number of aliens: {len(aliens)}")#
{'color': 'green', 'point': 5, 'speed': 'slow'}
{'color': 'green', 'point': 5, 'speed': 'slow'}
{'color': 'green', 'point': 5, 'speed': 'slow'}
{'color': 'green', 'point': 5, 'speed': 'slow'}
{'color': 'green', 'point': 5, 'speed': 'slow'}
...
Total number of aliens: 30

这些外星人都具有相同的特征, 但在Python看来, 每个外星人都是独立的, 这让我们能够独立地修改每个外星人

在什么情况下需要处理成群结队的外星人呢? 想象一下, 可能随着游戏的进行, 有些外星人会变色且加快移动速度. 必要时, 可使用 for 循环和 if 语句 来修改某些外星人的颜色. 例如要将前三个外星人修改为黄色、 速度为中等且值10分, 可这样做:

# 创建一个用于存储外星人的空列表
aliens = []# 创建30个绿色的外星人
for alien_number in range(30):new_alien = {'color': 'green', 'point': 5, 'speed': 'slow'}aliens.append(new_alien)for alien in aliens[:3]:if alien['color'] == 'green':alien['color'] = 'yellow'alien['speed'] = 'medium'alien['point'] = 10# 显示前5个外星人
for alien in aliens[:5]:print(alien)
print('...')#
{'color': 'yellow', 'point': 10, 'speed': 'medium'}
{'color': 'yellow', 'point': 10, 'speed': 'medium'}
{'color': 'yellow', 'point': 10, 'speed': 'medium'}
{'color': 'green', 'point': 5, 'speed': 'slow'}
{'color': 'green', 'point': 5, 'speed': 'slow'}
...

可进一步扩展这个循环, 在其中添加一个 elif 代码块, 将黄色 外星人改为移动速度快且值15分的红色外星人, 如下所示

for alien in aliens[0:3]:if alien['color'] == 'green':alien['color'] = 'yellow'alien['speed'] = 'medium'alien['point'] = 10elif alien['color'] == 'yellow':alien['color'] = 'red'alien['speed'] = 'fast'alien['points'] = 15

经常需要在列表中包含大量的字典, 而其中每个字典都包含特定对象的众多信息. 例如, 你可能需要为网站的每个用户创建一个字典, 并将这些字典存储在一个名为users 的列表中. 在这个列表中, 所有字典的结构都相同, 因此你可以遍历这个列表, 并以相同的方式处理其中的每个字典.

4.2 在字典中存储列表

# 存储所点披萨的信息
pizza = {'crust': 'thick','toppings': ['mushrooms', 'extra cheese'],
}# 概述所点的披萨
print(f"You ordered a {pizza['crust']}-crust pizza ""with the following toppings:")for topping in pizza['toppings']:print("\t" + topping)
#
You ordered a thick-crust pizza with the following toppings:mushroomsextra cheese

没当需要在字典中将一个键关联到多个值时, 都可以在字典中嵌套一个列表. 在本章前面有关喜欢的编程语言的示例中, 如果将每个人的回答都存储在一个列表中, 被调查者就可以选择多种喜欢的语言. 在这种情况下, 当我们遍历字典时, 与每个被调查者相关联的都是一个语言列表, 而不是一种语言; 因此, 在遍历该字典的for 循环中, 我们需要再使用一个for 循环来遍历与被调查者相关联的语言列表:

favorite_languages = {'jen': ['python', 'ruby'],'sarah': ['c'],'edward': ['ruby', 'go'],'phil': ['python', 'haskell'],
}for name, languages in favorite_languages.items():print(f"\n{name.title()}'s favorite languages are:")for language in languages:print(f'\t{language.title()}')#
Jen's favorite languages are:PythonRubySarah's favorite languages are:CEdward's favorite languages are:RubyGoPhil's favorite languages are:PythonHaskell

为进一步改进这个程序, 可在遍历字典的 for 循环开头添加一条 if 语句, 通过查看 len(languages)的值来确定当前的被调查者喜欢的语言是否有多种. 如果他喜欢的语言有多种, 就像以前一样显示输出; 如果只有一种, 就相应修改输出的措辞, 如显示 Sarah’s favorite language is C

注意: 列表和字典的嵌套层级不应太多. 若果嵌套层级比前面的示例多得多, 很可能有更简单的解决方案.

4.3 在字典中存储字典

例如, 如果有多个网站用户, 每个都有独特的用户名, 可在字典中将用户名作为键, 然后将每位用户的信息存储在一个字典中, 并将该字典作为与用户名相关联的值. 在下面的程序中, 存储了每位用户的三项信息: 名、姓和居住地。 为访问这些信息, 我们遍历所有的用户名, 并访问与每个用户名相关联的信息字典:

users = {'aeinstein': {'first': 'albert','last': 'einstein','location': 'princeton',},'mcurie': {'first': 'marie','last': 'curie','location': 'paris',},
}for username, user_info in users.items():print(f"\nUsername: {username}")full_name = f"{user_info['first']} {user_info['last']}"location = user_info['location']print(f'\tFull name: {full_name.title()}')print(f'\tlocation:{location.title()}')#
Username: aeinsteinFull name: Albert Einsteinlocation:PrincetonUsername: mcurieFull name: Marie Curielocation:Paris

表示每位用户的字典都具有相同的结构. 虽然Python 并没有这样的要求, 但这使得嵌套的字典处理起来更容易. 倘若表示每位用户的字典都包含不同的键, for循环内部的代码将更复杂

《Python从入门到实践》读书笔记——第六章 字典相关推荐

  1. python基础学习[python编程从入门到实践读书笔记(连载六)]:数据可视化项目第17章

    文章目录 使用API end 项目结果: 使用plotly可视化github最受欢迎的python仓库: 修改后的可视化图表: 使用API 编写独立的程序,实现对获取的数据可视化.我们使用Web AP ...

  2. python基础学习[python编程从入门到实践读书笔记(连载一)]

    写在前面:本文来自笔者关于<python编程从入门到实践>的读书笔记与动手实践记录. 程序员之禅 文章目录 02变量和简单数据类型 03 列表简介 04 操作列表 05 if语句 06 字 ...

  3. 《python编程:从入门到实践的》第六章:字典的例题代码

    在Python中,字典是一系列键-值对.每个键都与一个值相关联,你可以使用键来访问与之 相关联的值.与键相关联的值可以是数字.字符串.列表乃至字典.事实上,可将任何Python对 象用作字典中的值. ...

  4. Python从入门到实践习题答案(第九章 类)

    在学习<Python从入门到实践>,代码是自己编写的噢(虽然有些代码有参考其他大佬),点个赞再走8~ 9-1 餐馆:创建一个名为 Restaurant 的类,其方法__init__()设置 ...

  5. python基础学习[python编程从入门到实践读书笔记(连载三)]:django学习笔记web项目

    文章目录 Django项目:学习笔记web网页 项目部署 参考 自己部署的网站,还是小有成就感的,毕竟踩过很多坑,实战技能也有些许进步. 网站链接:http://lishizheng.herokuap ...

  6. python基础学习[python编程从入门到实践读书笔记(连载五)]:数据可视化项目第16章

    文章目录 下载数据 制作全球地震散点图:JSON格式 end 几个实验结果: 每日最高气温: 地震图绘制: 下载数据 CSV文件格式 在文本文件中存储数据,一个简单方式是将数据作为一系列以逗号分隔的值 ...

  7. python基础学习[python编程从入门到实践读书笔记(连载二)]:外星人入侵项目

    第一版游戏demo 添加计分系统:中间是最高得分,右边是本次得分. 显示余下的飞船数 主函数如下,完整程序将上传到笔者的github:https://github.com/shizhengLi/lea ...

  8. 《Python编程:从入门到实践》第十六章:下载数据

    下载数据 我们将访问并可视化以两种常见格式存储的数据:CSV和JSON.我们将使用Python模块csv来处理以CSV(逗号分隔的值)格式存储的天气数据,找出两个不同地区在一段时间内的最高温度和最低温 ...

  9. 《Microsoft Sql server 2008 Internals》读书笔记--第六章Indexes:Internals and Management(3)

    <Microsoft Sql server 2008 Internals>读书笔记订阅地址: http://www.cnblogs.com/downmoon/category/230397 ...

最新文章

  1. 1103 Integer Factorization 需再做
  2. PHP整站迁移空间,discuz整站数据迁移搬家教程
  3. js粘贴板为什么获取不到图片信息_JavaScript 学习笔记(3):图片库
  4. es6 ...展开运算符
  5. MetInfo最新版代码审计漏洞合集
  6. VC中使用低级音频函数WaveX播放声音文件
  7. linux守护进程写法_搞懂进程组、会话、控制终端关系,才能明白守护进程如何创建...
  8. mysql 事物状态有几种_关于MySQL的二十个经典面试题
  9. FFmpeg学习(0)——使用ffmpeg视频切片并加密
  10. RDP报表工具:详情式报表
  11. 哥德巴赫猜想-中文维基百科
  12. 迅捷新版PDF转换器
  13. 【其他】Hexo博客(Next主题)放弃多说,接入网易云跟贴
  14. 基于android点餐系统需求分析,基于Android智能终端的点餐系统设计研究
  15. 39《黑客与画家 : 硅谷创业之父Paul Graham文集》 -豆瓣评分8.8
  16. 【stm32f429igt6】的WiFi模块数据收发。
  17. 能写不重要,能P才重要,PS教程今天它来了!
  18. 共享和资源共享的区别
  19. html5的页面放到服务器video标签不播放
  20. 天使动漫 泉 此 方 桌面跳舞精灵

热门文章

  1. 泛泰SKYA850黑砖QHSUSB_DLOAD救砖教程(操作篇)[2013.6.3更新]
  2. Vue3封装Video.js组件(基于video.js)
  3. 豆瓣评分8.5+,这10本书读三遍也不够
  4. React 官网入门教程 - 井字棋小游戏
  5. 广州华夏职业学院计算机,牛!华夏学子被清华大学聘用!
  6. 移动增值业务系统发展趋势分析
  7. 移动增值业务随笔(2)
  8. VSS、VDD 与 VCC 的区别
  9. 故宫景点功课17:内廷西路(中)
  10. 工业企业危险源管理和应急管理解决方案