Hello,又是新的一天,新的一天从学习开始!学习使我快乐,学习使我进步!(默默的放下了手中的bilibili和游戏王和炉石和steam)。
今天开始学习《Python编程:从入门到实践》第三章:列表。
3.1 列表是什么
列表由一系列按特定顺序排列的元素组成。你可以创建包含字母表中所有字母、数字0~9或所有家庭成员姓名的列表;也可以将任何东西加入列表中,其中的元素之间可以没有任何关系。列表通常包含多个元素,因此给列表制定一个表示复数的名称(如letters、digits或names)是个不错的注意。
在Python中,用方括号[]表示列表,并用逗号分隔其中的元素。
这里说一下,这本书因为是外国人写的,所以里面的用例或者说明很大程度上都是以英文语境来叙述的。比如上文所说的,列表可以由字母、数字等组成。自然,其实也可以使用中文的。所以在下面的内容里,如果碰到一些纯英文用例,我有可能会修改用例内容,使之更容易懂。
>>> women = ['新垣结衣','长泽雅美','朴智妍','朴孝敏']
>>> print(women)
如果让Python将列表打印出来,Python将打印列表的内部表示,包括方括号:
['新垣结衣', '长泽雅美', '朴智妍', '朴孝敏']
鉴于这不是你要让用户看到的输出,下面来学习如何访问列表元素。
3.1.1 访问列表元素
列表是有序机核,因此要访问列表的任何元素,只需将该元素的位置(索引)告诉Python即可。要访问列表元素,可支出列表的名称,再指出列表的索引,并将后者放在方括号内。
例如,下面的代码姜葱列表women中提取第一位女性:
women = ['新垣结衣','长泽雅美','朴智妍','朴孝敏']
print(women[0])
以上演示了访问列表元素的语法。当你请求获取列表元素时,Python只返回该元素,而不包含方括号:
新垣结衣
这正是你要让用户看到的结果——整洁、干净的输出。
你还可以对任意列表元素调用第2章介绍的字符串方法。例如可以使用方法title()让英文元素的格式更简洁:
>>> women = ['xinyuanjieyi','长泽雅美','朴智妍','朴孝敏']
>>> print(women[0].title())
Xinyuanjieyi
这个示例的输出的首字母变为了大写。
3.1.2 索引从0而不是1开始
在Python中,第一个列表元素的索引为0,而不是1.大多数变成语言都是如此规定的,这与列表操作的底层实现相关。如果结果出乎意料,请看看你是否犯了简单的差一错误。
第二个列表元素的索引为1.根据这种简单的计数方式,要访问列表的任何元素,都可以将其位置-1,并将结果作为索引。例如,要访问第四个列表元素,可使用索引3.
>>> women = ['新垣结衣','长泽雅美','朴智妍','朴孝敏']
>>> print(women[3])
朴孝敏
>>> print(women[4])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
*注意,如上所说,因为是从0开始计数的。所以当我们打印4的时候,在列表里的位置其实是第五个。而列表里一共就四个元素,所以找不到第五个,出现报错。
Python为访问最后一个列表元素提供了一种特殊语法。通过将索引指定为-1,可让Python返回最后一个列表元素
>>> women = ['新垣结衣','长泽雅美','朴智妍','朴孝敏']
>>> print(women[-1])
朴孝敏
这种语法很有用,因为你经常需要在不知道列表长度的情况下访问最后的元素。这种约定也适用于其他负数索引。例如,索引-2返回倒数第二个列表元素,索引-3返回倒数第三个列表元素,以此类推。
3.1.3 使用列表中的各个值
你可以像使用其他变量一样使用列表的各个值。例如,可以使用f字符串根据列表中的值来创建消息。
>>> women = ['新垣结衣','长泽雅美','朴智妍','朴孝敏']
>>> mygilr=f"my girlfriend is {women[-1]}"
>>> print(mygilr)
my girlfriend is 朴孝敏
这里说一下f字符串,f字符串就是可以在字符串中插入变量的值。用法是在前引号前加上字母f,再将要插入的变量放在花括号内。
3.2 修改、添加和删除元素
你创建的大多数列表将是动态的,这意味着列表创建后,将锁着程序的运行增删元素。例如,你创建一个游戏,要求玩家射杀从天而降的外星人。为此,可在开始时将一些外星人存储在列表中,然后每当有外星人被射杀时,都将其从列表中删除,而每次有新的外星人出现在屏幕上时,都将其添加到列表中。在整个游戏运行期间,外星人的列表长度将不断变化。
3.2.1 修改列表元素
修改列表元素的语法与访问列表元素的语法类似。要修改列表元素,可指定列表名和要修改的元素的索引,再指定该元素的新值。
例如,有一个女孩子的列表,其中第一个元素是黄渤,如何修改它的值呢?
>>> women = ['黄渤','新垣结衣','长泽雅美','朴智妍','朴孝敏']
>>> print(women)
['黄渤', '新垣结衣', '长泽雅美', '朴智妍', '朴孝敏']
>>> women[0]="金泫雅"
>>> print(women)
['金泫雅', '新垣结衣', '长泽雅美', '朴智妍', '朴孝敏']
首先定义一个女孩子列表,其中第一个元素为“黄渤”。接下来,将第一个元素的值改为“金泫雅”。输出表明,第一个元素的值确实变了,但其他列表元素的值没变。
你可以修改任意列表元素的值,而不仅仅是第一个元素的值。
3.2.2 在列表中添加元素
你可能出于众多原因要在列表中添加新元素。例如,你可能希望游戏中出现新的外星人、添加可视化数据或者给网站添加新注册的用户。python提供了多种在既有列表中添加新数据的方式。
1.在列表末位添加元素
在列表中添加新元素时,最简单的方式是将元素附加(append)到列表。给列表附加元素时,它将添加列表末位。继续使用前一个示例中的列表,在其末位添加新元素'金泫雅'。
>>> women = ['新垣结衣','长泽雅美','朴智妍','朴孝敏']
>>> women.append('金泫雅')
>>> print(women)
['新垣结衣', '长泽雅美', '朴智妍', '朴孝敏', '金泫雅']
方法append()将元素'金泫雅'添加到列表末尾,而不影响列表中的其他所有元素。
方法append()让动态地创建列表易如反掌。例如,你可以先创建一个空列表,再使用一系列的函数调用append()来添加元素。下面创建一个空列表,再在其中添加元素'新垣结衣','长泽雅美','朴智妍','朴孝敏':
>>> women=[]
>>> women.append('新垣结衣')
>>> women.append('长泽雅美')
>>> women.append('朴智妍')
>>> women.append('朴孝敏')
>>> print(women)
['新垣结衣', '长泽雅美', '朴智妍', '朴孝敏']
2.在列表中插入元素
使用方法insert()可在列表的任何位置添加新元素。为此,你需要指定新元素的索引和值。
>>> women = ['新垣结衣','长泽雅美','朴智妍','朴孝敏']
>>> women.insert(0,'新垣结衣') # 在列表处0这个位置增加字符串'新垣结衣',而原有0位置的长泽雅美则变为1.后续元素一次类推。
>>> print(women)
['新垣结衣', '新垣结衣', '长泽雅美', '朴智妍', '朴孝敏']
3.2.3 从列表中删除元素
你经常需要从列表中删除一个或多个元素。例如,玩家将空中一个外星人射杀后,你很可能要将其从存活的外星人列表中删除;当用户在你创建的web应用中注销账户时,你就需要将该用户从活动用户列表中删除。你可以根据位置或值来删除列表中的元素。
1.使用del语句删除元素
如果知道要删除的元素再列表中的位置,可以使用del语句。
>>> women = ['黄渤','新垣结衣','长泽雅美','朴智妍','朴孝敏']
>>> del women[0]
>>> print(women)
['新垣结衣', '长泽雅美', '朴智妍', '朴孝敏']
此处的代码使用del删除了列表women中的第一个元素'黄渤'。
使用del可删除任意位置处的列表元素,条件是知道其索引。例如,下面演示了如何删除前述列表中第二个元素'黄子华':
>>> women = ['新垣结衣','黄子华','长泽雅美','朴智妍','朴孝敏']
>>> del women[1]
>>> print(women)
['新垣结衣', '长泽雅美', '朴智妍', '朴孝敏']
在这两个示例中,使用del语句将值从列表中删除后,你就无法再访问它了。
2.使用pop()删除元素
有时候,你要讲元素从列表中删除,并借着使用它的值。例如,你可能需要获取刚被射杀的外星人的x坐标和y坐标,以便在响应的位置显示爆炸效果:在web应用程序中,你可能要将用户从活跃成员列表中删除,并将其加入非活跃成员列表中。
方法pop()删除列表末位的元素,并让你能够接着使用它。术语弹出(pop)源自这样的类比:列表就像一个栈,而删除列表末尾的元素相当于弹出栈顶元素。 #明明大家好好在学新手教程,突然来了一句“栈顶元素”,大哥,啥意思啊。
首先定义列表women,接下来从这个列表弹出一个值,并将其赋给变量mygirl,然后打印这个列表,以核实从中删除了一个值。最后打印弹出的值,以证明我们依然能够访问被删除的值。
>>> women = ['新垣结衣','长泽雅美','朴智妍','朴孝敏']
>>> mygirl= women.pop()
>>> print(women)
['新垣结衣', '长泽雅美', '朴智妍']
>>> print(mygirl)
朴孝敏
输出表明,列表末位的值'朴孝敏'已删除,它现在被富裕变量mygirl。
方法pop()有什么用处呢?假设列表中的女孩子是按照交往时间存储的,就可使用pop()方法打印一条消息,支出最后交往的是哪个女朋友:
>>> women = ['新垣结衣','长泽雅美','朴智妍','朴孝敏']
>>> mygirlfriend = women.pop()
>>> print(f"我的女朋友是{mygirlfriend}。")
我的女朋友是朴孝敏。
别忘了,每当你使用pop()时,被弹出的元素就不再列表中了。
如果你不确定该使用del语句还是pop()语句,下面是一个简单的判断标准:如果你要从列表中删除一个元素,且不再以任何方式使用它,就使用del语句;如果你要在删除元素后还能继续使用它,就使用方法pop()。
4.根据值删除元素
有时候,你不知道要从列表中删除的值所处的位置。如果只知道要删除的元素的值,可使用方法remove()。
例如,假设要在列表mygirlfriend中删除值'堀北真希'。
>>> mygirlfriend = ['新垣结衣','长泽雅美','朴智妍','朴孝敏','堀北真希']
>>> mygirlfriend.remove('堀北真希')
>>> print(mygirlfriend)
['新垣结衣', '长泽雅美', '朴智妍', '朴孝敏']
此处的代码让Python确定'堀北真希'出现在列表的什么地方,并将该元素删除>
使用remove()从列表中删除元素时,也可接着使用它的值。下面删除值'堀北真希'并打印一条消息,指出要将其从列表中删除的原因:
>>> mygirlfriend = ['新垣结衣','长泽雅美','朴智妍','朴孝敏','堀北真希']
>>> wife = "堀北真希"
>>> mygirlfriend.remove(wife)
>>> print(f"\n{wife}背着我跟别人结婚了。")# \n是空行符
堀北真希背着我跟别人结婚了。
定义列表,将值'堀北真希'赋给变量'wife'。接下来,使用这个变量来告诉Python将哪个值从列表中删除。最后,值'堀北真希'已经从列表中删除,但可通过变量wife来访问它。这让我们能够打印一条消息,指出'堀北真希'从列表mygirlfriend删除的原因。
注意:方法remove()只删除第一个指定的值。如果要删除的值可能在列表中出现多次,就需要使用循环来保证每个值都删除。这将在第7章中介绍。
3.3 组织列表
在你创建的列表中,元素的排列顺序常常是无法预测的,因为你并非总能控制用户提供数据的顺序。这虽然在大多数情况下不可避免的,但你经常需要以特定的顺序呈现信息。有时候,你希望保留列表元素最初的排列顺序,而有时候又需要调整排列顺序。Python提供了很多组织列表的方式,可根据具体情况选用。
3.3.1 使用方法sort()对列表永久排序
Python方法sort()让你能够较为轻松地对列表进行排序。假设有一个女朋友列表,并让其中的女朋友按名字字母顺序排序排列。为简化这项任务,假设该列表的所有值都是小写的。
>>> mygirlfriend = ['xinyuanjieyi','piaozhiyan','quanxiaosheng']
>>> mygirlfriend.sort()
>>> print(mygirlfriend)
['piaozhiyan', 'quanxiaosheng', 'xinyuanjieyi']
方法sort()永久性地修改列表元素的排序顺序。现在,汽车是按字母排序排列的,再也无法恢复到原来的排列顺序。
还可以按与字母顺序相反的顺序排列列表元素,只需向sort()方法传递参数,reverse = True即可。下面的示例将女友列表按与字母顺序相反的顺序排列:
>>> mygirlfriend = ['xinyuanjieyi','piaozhiyan','quanxiaosheng']
>>> mygirlfriend.sort(reverse = True)
>>> print(mygirlfriend)
['xinyuanjieyi', 'quanxiaosheng', 'piaozhiyan']
同样,对列表元素排列顺序的修改是永久的。
这里要说明一下,原本这里我依然想按照中文拼音首字母方式排序。但是好像难度颇高,无法直接作用。
如果只是用默认的sort()语法来做,排序会看不懂。我百度了一下,说是因为系统看不懂中文的读音,所以使用的是顺序是判断字符的方式进行排序,那就更乱了。所以只能妥协使用拼音来做范例。
3.3.2 使用函数sorted()对列表临时排序
要保留列表元素原来的排列顺序,同时以特定的顺序呈现它们,可使用函数sorted()。函数sorted()让你能够按特定顺序显示列表元素,同时不影响它们在列表中的原始排列顺序。
下面尝试来对女友列表调用这个函数:
mygirlfriend = ['xinyuanjieyi','piaozhiyan','quanxiaosheng']
print("我的女朋友们包括但不限于:")
print(mygirlfriend)
print("如果把她们按照首字母顺序:")
print(sorted(mygirlfriend))
print("如果不排序的话,那就还是老样子:")
print(mygirlfriend)
首先按原始顺序打印列表,再按照字母顺序显示该列表。以特定顺序显示列表后,我们进行核实,确定列表元素的排列顺序与以前相同。
我的女朋友们包括但不限于:
['xinyuanjieyi', 'piaozhiyan', 'quanxiaosheng']
如果把她们按照首字母顺序:
['piaozhiyan', 'quanxiaosheng', 'xinyuanjieyi']
如果不排序的话,那就还是老样子:
['xinyuanjieyi', 'piaozhiyan', 'quanxiaosheng']
注意,调用函数sorted()后,列表元素的排列顺序并没有变。如果要按与字母顺序相反的顺序显示列表,也可向函数sorted()传递参数reverse = True。
*注意:在并非所有值都是小写时,按字母排序排列列表要复杂些。决定排序顺序时,有多种解读大写字母的方式,要制定准确的列表顺序,可能比我们这里所做的要复杂。然而,大多数排序方式是以本节介绍的知识为基础的。
3.3.3 倒着打印列表
要反转列表元素的排列顺序,可使用方法reverse()。假设女友列表是按照交往时间排列的,可轻松地按相反的顺序排列其中的女友:
>>> mygirlfriend = ['新垣结衣','长泽雅美','朴智妍','朴孝敏','全孝盛']
>>> mygirlfriend.reverse()
>>> print(mygirlfriend)
['全孝盛', '朴孝敏', '朴智妍', '长泽雅美', '新垣结衣']
注意,reverse()不是按与字母顺序相反的顺序排列列表元素,而只是反转列表元素的排列顺序。
方法reverse()永久性地修改列表元素的排列顺序,但可能随时恢复到原来的排列顺序,只需对列表再次调用reverse()即可。
3.3.4 确定列表的长度
使用函数len()可快速获悉列表的长度。在下面的示例中,列表包含四个元素,因此其长度为:4.
>>> mygirlfriend = ['新垣结衣','朴智妍','朴孝敏','全孝盛']
>>> len(mygirlfriend)
4
需要完成如下任务时,len()很有用:明确还有多少外星人未被射杀,确定需要管理多少项可视化数据,计算网站有多少注册用户,等等。
注意:Python计算列表元素数时从1开始,因此确定列表长度时,你应该不会遇到差一错误。
3.4 使用列表时避免索引错误
刚开始使用列表时,经常会遇到一种错误。假设你有一个包含三个元素的列表,却要求获取第四个元素。
>>> mygirlfriend = ['朴智妍','朴孝敏','全孝盛']
>>> print(mygirlfriend[3])
这将导致索引错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
Python试图向你提供位于索引3处的元素,但它搜索列表mygirlfriend时,却发现索引3处没有元素。鉴于列表索引差一的特征,这种错误很常见。有些人从1开始数,因此以为第三个元素的索引为3.然而在Python中,第三个元素的索引为2,因此索引是从0开始的。
索引错误意味着Python在制定索引处找不到元素。程序发生索引错误时,请尝试将指定的索引减1,然后再次运行程序,看看结果是否正确。
别忘了,每当需要访问最后一个列表元素时,都可使用索引-1.这在任何情况下都行之有效,即便你最后一次访问列表后,其长度发生了变化:
>>> mygirlfriend = ['朴智妍','朴孝敏','全孝盛']
>>> print(mygirlfriend[-1])
全孝盛
仅当列表为空时,这种访问最后一个元素的方式才会导致错误:
>>> myboyfriend = []
>>> print(myboyfriend[-1])
列表myboyfriend不包含任何元素,因此Python返回一条索引错误消息:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
注意:发生索引错误却找不到解决方法时,请尝试将列表或其长度打印出来。列表可能与你以为的截然不同,在程序对其进行了动态处理时尤其如此。通过查看列表或其包含的元素数,可帮助你找到这种逻辑错误。
OK~第三章的《列表》就到这里了。因为在小甲鱼那里学了列表,所以本节还是过的比较快的。下篇文章是讲操作列表的。
可能有人发现,我基本上是将书本抄写了一遍。那是因为现在内容比较少,抄抄书有利于复健。等后面内容变多了,再这样抄书就不可能了。啥时候内容会多呢?伐晓得。
今天就这样啦,拜拜~
胭惜雨
2021年01月28日