Python:核心知识点整理大全12-笔记

简介: Python:核心知识点整理大全12-笔记

6.3.3 按顺序遍历字典中的所有键

字典总是明确地记录键和值之间的关联关系,但获取字典的元素时,获取顺序是不可预测的。 这不是问题,因为通常你想要的只是获取与键相关联的正确的值。

要以特定的顺序返回元素,一种办法是在for循环中对返回的键进行排序。为此,可使用函 数sorted()来获得按特定顺序排列的键列表的副本:

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

这条for语句类似于其他for语句,但对方法dictionary.keys()的结果调用了函数sorted()。 这让Python列出字典中的所有键,并在遍历前对这个列表进行排序。输出表明,按顺序显示了所 有被调查者的名字:

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.

6.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()) 

这条for语句提取字典中的每个值,并将它们依次存储到变量language中。通过打印这些值, 就获得了一个列表,其中包含被调查者选择的各种语言:

The following languages have been mentioned:
Python
C
Python
Ruby

这种做法提取字典中所有的值,而没有考虑是否重复。涉及的值很少时,这也许不是问题, 但如果被调查者很多,最终的列表可能包含大量的重复项。为剔除重复项,可使用集合(set)。 集合类似于列表,但每个元素都必须是独一无二的:

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

通过对包含重复元素的列表调用set(),可让Python找出列表中独一无二的元素,并使用这 些元素来创建一个集合。在1处,我们使用了set()来提取favorite_languages.values()中不同的 语言。

结果是一个不重复的列表,其中列出了被调查者提及的所有语言:

The following languages have been mentioned:
Python
C
Ruby 

随着你更深入地学习Python,经常会发现它内置的功能可帮助你以希望的方式处理数据。

6.4 嵌套

有时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套。你 可以在列表中嵌套字典、在字典中嵌套列表甚至在字典中嵌套字典。正如下面的示例将演示的, 嵌套是一项强大的功能。

6.4.1 字典列表

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

aliens.py

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

我们首先创建了三个字典,其中每个字典都表示一个外星人。在处,我们将这些字典都放 到一个名为aliens的列表中。最后,我们遍历这个列表,并将每个外星人都打印出来:

{'color': 'green', 'points': 5}
{'color': 'yellow', 'points': 10}
{'color': 'red', 'points': 15} 

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

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

在这个示例中,首先创建了一个空列表,用于存储接下来将创建的所有外星人。在1处, range()返回一系列数字,其唯一的用途是告诉Python我们要重复这个循环多少次。每次执行这个 循环时,都创建一个外星人(见2),并将其附加到列表aliens末尾(见3)。在4处,使用 一个切片来打印前五个外星人;在5处,打印列表的长度,以证明确实创建了30个外星人:

{'speed': 'slow', 'color': 'green', 'points': 5}
{'speed': 'slow', 'color': 'green', 'points': 5}
{'speed': 'slow', 'color': 'green', 'points': 5}
{'speed': 'slow', 'color': 'green', 'points': 5}
{'speed': 'slow', 'color': 'green', 'points': 5}
...
Total number of aliens: 30

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

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

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

鉴于我们要修改前三个外星人,需要遍历一个只包含这些外星人的切片。当前,所有外星人 都是绿色的,但情况并非总是如此,因此我们编写了一条if语句来确保只修改绿色外星人。如果 外星人是绿色的,我们就将其颜色改为'yellow',将其速度改为'medium',并将其点数改为10, 如下面的输出所示:

{'speed': 'medium', 'color': 'yellow', 'points': 10}
{'speed': 'medium', 'color': 'yellow', 'points': 10}
{'speed': 'medium', 'color': 'yellow', 'points': 10}
{'speed': 'slow', 'color': 'green', 'points': 5}
{'speed': 'slow', 'color': 'green', 'points': 5}
... 

你可以进一步扩展这个循环,在其中添加一个elif代码块,将黄色外星人改为移动速度快且 值15个点的红色外星人,如下所示(这里只列出了循环,而没有列出整个程序):

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

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

6.4.2 在字典中存储列表

有时候,需要将列表存储在字典中,而不是将字典存储在列表中。例如,你如何描述顾客点的比萨呢?如果使用列表,只能存储要添加的比萨配料;但如果使用字典,就不仅可在其中包含 配料列表,还可包含其他有关比萨的描述。 在下面的示例中,存储了比萨的两方面信息:外皮类型和配料列表。其中的配料列表是一个 与键'toppings'相关联的值。要访问该列表,我们使用字典名和键'toppings',就像访问字典中 的其他值一样。这将返回一个配料列表,而不是单个值:

pizza.py

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

我们首先创建了一个字典,其中存储了有关顾客所点比萨的信息(见1)。在这个字典中, 一个键是'crust',与之相关联的值是字符串'thick';下一个键是'toppings',与之相关联的值 是一个列表,其中存储了顾客要求添加的所有配料。制作前我们概述了顾客所点的比萨(见2)。 为打印配料,我们编写了一个for循环(见3)。为访问配料列表,我们使用了键'toppings',这 样Python将从字典中提取配料列表。

下面的输出概述了要制作的比萨:

You ordered a thick-crust pizza with the following toppings:
 mushrooms
 extra cheese

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

favorite_languages.py

1 favorite_languages = {
 'jen': ['python', 'ruby'],
 'sarah': ['c'],
 'edward': ['ruby', 'go'],
 'phil': ['python', 'haskell'],
 }
2 for name, languages in favorite_languages.items():
 print("\n" + name.title() + "'s favorite languages are:")
3 for language in languages:
 print("\t" + language.title()) 

正如你看到的,现在与每个名字相关联的值都是一个列表(见1)。请注意,有些人喜欢的 语言只有一种,而有些人有多种。遍历字典时(见2),我们使用了变量languages来依次存储字 典中的每个值,因为我们知道这些值都是列表。在遍历字典的主循环中,我们又使用了一个for 循环来遍历每个人喜欢的语言列表(见3)。现在,每个人想列出多少种喜欢的语言都可以:

Jen's favorite languages are:
 Python
 Ruby
Sarah's favorite languages are:
 C
Phil's favorite languages are:
 Python
 Haskell
Edward's favorite languages are:
 Ruby
 Go 

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


注意

列表和字典的嵌套层级不应太多。如果嵌套层级比前面的示例多得多,很可能有更简单 的解决问题的方案。

目录
相关文章
|
8天前
|
测试技术 API Python
【10月更文挑战第1天】python知识点100篇系列(13)-几种方法让你的电脑一直在工作
【10月更文挑战第1天】 本文介绍了如何通过Python自动操作鼠标或键盘使电脑保持活跃状态,避免自动息屏。提供了三种方法:1) 使用PyAutoGUI,通过安装pip工具并执行`pip install pyautogui`安装,利用`moveRel()`方法定时移动鼠标;2) 使用Pymouse,通过`pip install pyuserinput`安装,采用`move()`方法移动鼠标绝对位置;3) 使用PyKeyboard,同样需安装pyuserinput,模拟键盘操作。文中推荐使用PyAutoGUI,因其功能丰富且文档详尽。
|
4天前
|
安全 Linux 数据安全/隐私保护
python知识点100篇系列(15)-加密python源代码为pyd文件
【10月更文挑战第5天】为了保护Python源码不被查看,可将其编译成二进制文件(Windows下为.pyd,Linux下为.so)。以Python3.8为例,通过Cython工具,先写好Python代码并加入`# cython: language_level=3`指令,安装easycython库后,使用`easycython *.py`命令编译源文件,最终生成.pyd文件供直接导入使用。
python知识点100篇系列(15)-加密python源代码为pyd文件
|
5天前
|
网络协议 数据库连接 Python
python知识点100篇系列(17)-替换requests的python库httpx
【10月更文挑战第4天】Requests 是基于 Python 开发的 HTTP 库,使用简单,功能强大。然而,随着 Python 3.6 的发布,出现了 Requests 的替代品 —— httpx。httpx 继承了 Requests 的所有特性,并增加了对异步请求的支持,支持 HTTP/1.1 和 HTTP/2,能够发送同步和异步请求,适用于 WSGI 和 ASGI 应用。安装使用 httpx 需要 Python 3.6 及以上版本,异步请求则需要 Python 3.8 及以上。httpx 提供了 Client 和 AsyncClient,分别用于优化同步和异步请求的性能。
python知识点100篇系列(17)-替换requests的python库httpx
|
1天前
|
调度 Python
python知识点100篇系列(20)-python协程与异步编程asyncio
【10月更文挑战第8天】协程(Coroutine)是一种用户态内的上下文切换技术,通过单线程实现代码块间的切换执行。Python中实现协程的方法包括yield、asyncio模块及async/await关键字。其中,async/await结合asyncio模块可更便捷地编写和管理协程,支持异步IO操作,提高程序并发性能。协程函数、协程对象、Task对象等是其核心概念。
|
2天前
|
Java Python
> python知识点100篇系列(19)-使用python下载文件的几种方式
【10月更文挑战第7天】本文介绍了使用Python下载文件的五种方法,包括使用requests、wget、线程池、urllib3和asyncio模块。每种方法适用于不同的场景,如单文件下载、多文件并发下载等,提供了丰富的选择。
|
3天前
|
数据安全/隐私保护 流计算 开发者
python知识点100篇系列(18)-解析m3u8文件的下载视频
【10月更文挑战第6天】m3u8是苹果公司推出的一种视频播放标准,采用UTF-8编码,主要用于记录视频的网络地址。HLS(Http Live Streaming)是苹果公司提出的一种基于HTTP的流媒体传输协议,通过m3u8索引文件按序访问ts文件,实现音视频播放。本文介绍了如何通过浏览器找到m3u8文件,解析m3u8文件获取ts文件地址,下载ts文件并解密(如有必要),最后使用ffmpeg合并ts文件为mp4文件。
|
6天前
|
Java Python
python知识点100篇系列(16)-python中如何获取线程的返回值
【10月更文挑战第3天】本文介绍了两种在Python中实现多线程并获取返回值的方法。第一种是通过自定义线程类继承`Thread`类,重写`run`和`join`方法来实现;第二种则是利用`concurrent.futures`库,通过`ThreadPoolExecutor`管理线程池,简化了线程管理和结果获取的过程,推荐使用。示例代码展示了这两种方法的具体实现方式。
python知识点100篇系列(16)-python中如何获取线程的返回值
|
9天前
|
搜索推荐 Python
Leecode 101刷题笔记之第五章:和你一起你轻松刷题(Python)
这篇文章是关于LeetCode第101章的刷题笔记,涵盖了多种排序算法的Python实现和两个中等难度的编程练习题的解法。
15 3
|
7天前
|
Python
python知识点100篇系列(14)-分割大文件然后在合并
【10月更文挑战第2天】在工作中,因邮件附件大小限制或网络条件不佳,常需将大文件分割为小文件发送,接收后再合并。Python的文件读写功能可轻松实现此需求,也可借助第三方库filesplit简化操作。安装filesplit后,仅需几行代码即可完成文件的分割与合并,但掌握Python内置方法同样重要。
|
9天前
|
算法 C++ Python
Leecode 101刷题笔记之第四章:和你一起你轻松刷题(Python)
这篇博客是关于LeetCode上使用Python语言解决二分查找问题的刷题笔记,涵盖了从基础到进阶难度的多个题目及其解法。
12 0