![机器学习入门:Python语言实现](https://wfqqreader-1252317822.image.myqcloud.com/cover/84/41787084/b_41787084.jpg)
3.1 列表
Python支持列表数据类型,以及丰富的列表相关功能。由于列表不需要统一数据类型,所以你可以创建不同数据类型的列表,以及多维列表。接下来的几节将展示如何在Python中操作列表结构。
3.1.1 列表和基本操作
Python列表由一对方括号括起来的逗号分隔值(comma-separated value)组成。以下示例说明了在Python中定义列表的语法,以及如何对Python列表执行各种操作:
![057-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/057-01.jpg?sign=1739318619-v74aYAipFwkbBxqesytYhxX3iSfTZrbB-0-5f1347db7f22e36834f9fc15d4b4d4fd)
你可以将多个变量分配给一个列表,前提是变量的数量和类型要与列表结构匹配。举个例子:
![058-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/058-01.jpg?sign=1739318619-noD9O1Q2idd5DoGy8Kvfg5Wzw1M3DzeC-0-8cd707d0df33425f0a51883aeb04c79d)
以下示例说明了如何在更复杂的数据结构中给变量赋值:
![058-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/058-02.jpg?sign=1739318619-gunxOAuVY0swMLUCDr3QEeSxP6KINKhR-0-620bbc9fef984848f3e72ed542335b1f)
如果要获取上述代码块中date1
元素的年/月/日组成部分,可进行如下操作:
![058-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/058-03.jpg?sign=1739318619-aB8c9odubIRuxs8dlunpaAtFAtsNrv8y-0-02f68e140475456d5d34beb04485409e)
如果变量的数量和/或结构与数据不匹配,则会显示一条错误消息,如下所示:
![058-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/058-04.jpg?sign=1739318619-ogy3yLfG8a97RNzCNq7Ur43v5KnaNkWA-0-54962ee8e20062f3510def538f07f1f7)
如果指定的变量数少于数据的项数,你将看到一条错误消息,如下所示:
![059-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/059-01.jpg?sign=1739318619-0Q80ty1CCJvPkQe6hxZBM1A2sCUFsmFd-0-57183642a0c9896069bb1995034fb1a9)
1. 反转和排序列表
Python的reverse()
方法可反转列表的内容,如下所示:
![059-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/059-02.jpg?sign=1739318619-Qgj6SZNuDk4z0zXdWLalIa9JtihaoV0p-0-fd57832194d8afd58042f4db82a1db64)
Python的sort()
方法可对列表进行排序:
![059-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/059-03.jpg?sign=1739318619-vnAaL0puEqElti1gKLhX87ejgYvQpU79-0-cbffb5b70cae96621fc85c63e591b521)
你可以对列表进行排序,然后反转其内容,如下所示:
![059-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/059-04.jpg?sign=1739318619-5a1bnYxDAo2dpRQrhvYSsUNBgWcGHP6n-0-514bbbec51b381dd50ac5c74bbb4e539)
另一种反转列表的方法如下所示:
![059-05](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/059-05.jpg?sign=1739318619-gsoAm5mbV2zOQ3VCsRxZyds7FVWuUfe4-0-4ee5b18957cbaf5a721a90d2e293cc3c)
需要牢记的是,reversed(array)
是可迭代的,而且它并不是列表。但以下代码片段可以将一个反转的数组转换为列表:
![059-06](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/059-06.jpg?sign=1739318619-npVjFBKGaXXAEcelV7WgvRhQfOOYSZoz-0-9acdf764e756ac7cd04e3f44801b116b)
清单3.1包含一个while
循环,其逻辑与前面介绍的列表相反:如果num
可被多个数字整除(每个数字都严格小于num
),则num
不是素数。
清单3.1 Uppercase1.py
![059-07](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/059-07.jpg?sign=1739318619-v4OiCg2Va7AQ26WNGciotUp9rVgxIzVV-0-ace8202c33feadac9ff01b6477217c77)
清单3.1的输出如下所示:
![060-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/060-01.jpg?sign=1739318619-P7KIxtXV67mHqY5aUTepwsWlABJI3Znq-0-de590a0e0ae2270f5f8b59fdc225ab0f)
排序的数字列表中,第一个数字是最小值。如果反转排序列表,则第一个数字是最大值。以下代码说明了有很多方法可以反转列表:
![060-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/060-02.jpg?sign=1739318619-2jTxJZdyBaZ0ZLpwCi3y0CLrF5mKSRpi-0-71d07b100c45d7d97af187bdbb7fc7c9)
上述代码块的输出如下所示:
![060-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/060-03.jpg?sign=1739318619-nJikz8x5NIXcDSqdo5DXFTEd4xwzWudo-0-98a44fd43f26c828ace2407439e54d53)
第二种(更好的)方法对列表进行排序:
![060-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/060-04.jpg?sign=1739318619-GUI6ez5xmJG3w6psMeB3E59XddVi8gda-0-83a6abd47f36770474123362c66cdd79)
第三种列表排序方法涉及sort()
方法的内置函数:
![060-05](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/060-05.jpg?sign=1739318619-buHdpd72U9XAgxfq3X4H27IseG3k9owd-0-ab11652d3e3e91345065a570dc0b3c1e)
当你不想修改列表的原始顺序,或者想在一行上编写多个列表操作时,上述代码非常有用。
2. 过滤列表
Python可以过滤一个列表(也称作列表解析),如下所示:
![060-06](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/060-06.jpg?sign=1739318619-Y2lCOr5KObVPARzY8Reg1SbyId049RdC-0-b1a4a62b613bc476d60123963457e12e)
你也可以在过滤器中指定if/else
逻辑,如下所示:
![060-07](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/060-07.jpg?sign=1739318619-VTWvnI5WQChyaGSpayw6Gqm67avGKsmJ-0-d00fa0d7736a57426d836b683b2407c6)
上述代码块的输出如下所示:
![060-08](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/060-08.jpg?sign=1739318619-xjUMiFialc2f9PXQRmPeuGBQY1Y1pW0z-0-27a08aa63de038b8889b8b3d3e5b6540)
3. 数字和字符串的排序列表
清单3.2的Sorted1.py
脚本用于判断两个列表是否为排序列表。
清单3.2 Sorted1.py
![061-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/061-01.jpg?sign=1739318619-bp7Ddqddv9pZ3x0S20i7AaUYxwZvClZc-0-802b335ce992b68f1f05c27080e415f6)
清单3.2首先对列表list1
和list2
进行初始化,并分别基于列表list1
和list2
生成排序列表sort1
和sort2
。如果list1
等于sort1
,则list1
已被排序;同样,如果list2
等于sort2
,则list2
已被排序。
清单3.2的输出如下所示:
![061-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/061-02.jpg?sign=1739318619-vDYmXBsXARTRwvL3LJl2oCeTCHWIYi2d-0-09adcb943970a686f83e01a73bbfb26b)
请注意,如果对字符串列表进行排序,输出结果是区分大小写的,大写字母出现在小写字母之前。这是因为ASCII的核对顺序把大写字母(十进制65到十进制91)放在小写字母(十进制97到十进制127)之前。下例示例可具体解释说明:
![061-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/061-03.jpg?sign=1739318619-PF047Rqtsnak4BFRCOq6rrCYsqUeJWYF-0-ee1b4abf2f4b49110fcc2c36c69346ce)
你还可以设定反转选项,用反向的顺序对列表进行排序:
![061-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/061-04.jpg?sign=1739318619-jyyg3yGOBqLsBZD3CNfXUkcWqwFrf3r8-0-9e6468720822c75b71cc3617c1d57915)
你甚至可以根据列表中每一项的长度对列表进行排序:
![061-05](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/061-05.jpg?sign=1739318619-TnL9MH3MwnBEHD3QzZeuCf2qTlp3c0pM-0-0cceb817332bde2283b99be0c12db527)
如果想要在排序操作中将大写字母视为小写字母,可以设定str.lower
,如下所示:
![061-06](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/061-06.jpg?sign=1739318619-Kl3vqItyZqnzS6F01Re5P59vNezA6T98-0-abe77af0b92ad471e6159d773152def9)
4. Python中的冒泡排序
前面的示例说明了如何使用sort()
函数对数字列表进行排序。但有时需要在Python中实现其他类型的排序。清单3.3的BubbleSort.py
说明了如何在Python中实现冒泡排序。
清单3.3 BubbleSort.py
![062-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/062-01.jpg?sign=1739318619-5IlCYwTkuEE7HKCdpLGwjlQb8ea5xeb2-0-2afd88256a3f326c46e15b027f7a7b6e)
清单3.3的输出结果如下所示:
![062-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/062-02.jpg?sign=1739318619-Llh4mQHxktmecy3NkggUToPxC27XQIZQ-0-be1d199cb3261d82c6601c0462c3b886)
3.1.2 列表中的表达式
以下构造类似for
循环,但这个循环末尾没有冒号“:”字符:
![062-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/062-03.jpg?sign=1739318619-CJqgoYvESgJfi6UwttXZYofJGkOdM8wv-0-ebcb7a9628b765ed56b04ade65b11f22)
3.1.3 连接字符串列表
Python提供了join()
方法来连接文本字符串,如下所示:
![062-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/062-04.jpg?sign=1739318619-ReGlKIDleq6gYT8g46Z3qdTCGlGQbxZ6-0-d425b9a03491794eb75a9541aa270cbc)
有很多方法可以连接一组字符串,然后打印结果。下面这种是效率最低的方法:
![062-05](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/062-05.jpg?sign=1739318619-pDHfQ0tDdCa7z1Eree3BHkGR2W1MS7Kk-0-ca41ee5fb512604a506f9e99ea63415c)
以下两种都是更佳的方法:
![063-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/063-01.jpg?sign=1739318619-1e6y20P3lKjtAjVS5u2YZkMAMjhpqlIt-0-ba8108a1ecba31af0c51fc389a7453bf)
3.1.4 Python中的range()
函数
本节你将了解Python中可用于遍历列表的range()
函数,如下所示:
![063-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/063-02.jpg?sign=1739318619-ewjxawOt4F7ma3cfRLHjWXnPW0heL3ty-0-86ef4bdf512b81cf68d53e2a719d650d)
你可以使用for
循环遍历字符串列表,如下所示:
![063-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/063-03.jpg?sign=1739318619-H4ZTqLGzDCuF1RkI07IGWJkQ9UwCkc41-0-9d2fa75c14155cc9e7aa70befa743b71)
你可以使用for
循环遍历字符串列表,并显示更多详细信息,如下所示:
![063-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/063-04.jpg?sign=1739318619-cfDjOBahYfTTUmcflR3BVNhO9XvPCjF3-0-3c7d4ce85583596ec54cc8b4adf884c6)
上面的输出结果显示列表x
中每个字符串的长度,后跟字符串文本内容。
对数字、大写和小写字母计数
清单3.4的CountCharTypes.py脚本对字符串中数字和字母进行计数。
清单3.4 Counter1.py
![063-05](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/063-05.jpg?sign=1739318619-dBdZJo8BnbmNWPyDCNjm3ZTMBxVqHjFE-0-a570937766d933d90895e5db479dda96)
清单3.4初始化了与计数器相关的变量,后跟一个循环(其中循环变量设为i
),从0迭代到字符串str1
的长度。用字符串str1
索引i
位置上的字母来初始化变量char
。循环的下一部分使用条件逻辑来确定char
是数字还是字母字符。在后一种情况下(即字母字符时),代码会检查字符是大写还是小写。但不论怎样,相应的计数器变量的值都会增加。
清单3.4的输出结果如下所示:
![064-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/064-01.jpg?sign=1739318619-OO3JssOxbnN7yd8mBN6geM3rLuIHseiR-0-3ab3d8280504688f83cd92cb9ec06596)
3.1.5 数组和append()
函数
Python有一个数组类型(import array
),本质上是一个异构列表。但是除了略微节省内存使用之外,该数组类型与列表类型相比没有任何优势。你也可以定义异构数组:
![064-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/064-02.jpg?sign=1739318619-WIzQKqYSIQedEovAp0YUKr7fGgamRX1Z-0-0bcf13c814a3b754a630169179c06d4f)
你可以将新元素追加至一个列表中:
![064-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/064-03.jpg?sign=1739318619-pnWNcTQCKJgBevEMoLLFZtn41P7uHtlb-0-2173e55a9ba46d606558b34899c06fc5)
你可以将简单的变量赋值给列表中的元素,如下所示:
![064-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/064-04.jpg?sign=1739318619-kVus03TdyY2wLXjzZeCvmRvpQuXRHKbP-0-dc1119ee201730baddf7db511f94b947)
上述代码的输出如下所示:
![065-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/065-01.jpg?sign=1739318619-BIKGhxkpIJ9RdD2CWQbLp5m2s61cjJzw-0-439b79974812eb44615163f17686dba3)
Python中split()
函数比前面的示例更便捷(尤其是在元素数未知或可变的情况下),你将在下一节看到split()
函数的示例。
3.1.6 使用列表和split()
函数
你可以使用Python的split()
函数拆分文本字符串中的单词,并用这些单词填充一个列表,示例如下:
![065-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/065-02.jpg?sign=1739318619-N6AKVIk68b2025YcHmRKhCYd5JVOxSto-0-3de1563862d0f039e648feb29c278aff)
打印文本字符串中单词列表的一个简易方法如下所示:
![065-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/065-03.jpg?sign=1739318619-qoAI86cGSyY7Se5S6hf6HiM37u8UUdzY-0-7e6565251f143026683c0e0f512741ae)
你可以按以下方法搜索字符串中的单词:
![065-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/065-04.jpg?sign=1739318619-FAYjlta6WI5J8QQGIEtLioZuh1HeSSXo-0-4bcfb5cf8dc780c5827d6e350bcbaa4a)
3.1.7 对列表中的单词计数
Python提供了Counter
类,可以对列表中的单词进行计数。清单3.5的CountWord2.py
说明了如何计算出现频率最高的前三个单词。
清单3.5 CountWord2.py
![065-05](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/065-05.jpg?sign=1739318619-V08VInFVSWi69wBnM6I8CqikAeGh68I6-0-ce75212dcca0e75f3beb576cde655304)
清单3.5用一组字符初始化mywords
变量,然后将mywords
作为参数传递给Counter
来初始化word_counts
变量。topThree
变量是一个数组,包含了mywords
中的三个出现次数最多的字符(及其出现的次数)。清单3.5的输出如下:
![066-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/066-01.jpg?sign=1739318619-gLE3oErh2nkv46bZZI99ioxIN3MtOcjx-0-3fed4c34a2ef058be2484ba70d33cf42)
3.1.8 遍历成对的列表
Python支持成对的列表操作,这意味着可以执行类似于向量的操作。以下代码片段将每个列表元素乘以3:
![066-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/066-02.jpg?sign=1739318619-opS0VurYRmX2I1RCpdgm2RFWXevcEzlt-0-41ba2fd69ffe55a3bd15dae0483e24d9)
创建一个新列表,包含原始元素,以及原始元素乘以3的值:
![066-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/066-03.jpg?sign=1739318619-JpX6WpO96DVMhNoR8V1oqQiHwmUow2l9-0-5ca28f8687f5b508523e4b2cee5ff2be)
计算两个列表中每对数字的乘积:
![066-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/066-04.jpg?sign=1739318619-lrBKKBbXgqUTgf9anhO8TgrG3g7XlzSu-0-420a1d5c7d73734f4933accfad2263fd)
计算两个列表中每对数字的总和:
![066-05](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/066-05.jpg?sign=1739318619-oDeqUKPdLCW56ZGMkPG1u9zsNUIFyaTo-0-874b35284ebba46992b08b4f17a35ad3)
计算两个列表的每对元素的乘积:
![066-06](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/066-06.jpg?sign=1739318619-v2S8mcqqfoNXS8v3dK5HL0zY8rQjpAxq-0-0420b24b15c865a553c59801426e3ab4)
3.1.9 其他与列表相关的函数
Python还提供了其他与列表相关的函数,例如append()
、insert()
、delete()
、pop()
和extend()
。Python中也支持index()
、count()
、sort()
和reverse()
函数。以下代码块说明了这些函数。
定义一个Python列表(允许数字重复):
![066-07](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/066-07.jpg?sign=1739318619-HraPpNOIljbdMq9KzdnoK35nBnghmmfe-0-696e29e526a6bef25b2d0c449ac5a74c)
显示1和2的出现次数:
![067-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/067-01.jpg?sign=1739318619-N5FESpPHXSDIDBfjEov9jJFayyJI4wBD-0-1893236990e3a4c997d2247feb4cba9a)
在位置3处插入-8:
![067-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/067-02.jpg?sign=1739318619-WxKZP9ngjBfVEShclL4jwTFnZYa2FiVV-0-d6560443619857f7ddc7bbf03a3a12b0)
从例表中删除3:
![067-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/067-03.jpg?sign=1739318619-Bk01TZYJjDFAzM8AuwNFUKKQ9buQKilF-0-d39ab65a6c5b69f69c551bd99dba6b60)
从例表中删除1:
![067-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/067-04.jpg?sign=1739318619-ePgZ87Ps5beG5IOWQgSa6XFsuomxHKEZ-0-905f6b38bee0d45dc6f9317d2893341f)
将19添加至列表:
![067-05](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/067-05.jpg?sign=1739318619-xpvNqxMRwpZEZWQ7jQU0q2K9eoTfWcY9-0-4331df59cb21e8b77e2593ee86509985)
打印列表中19的索引:
![067-06](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/067-06.jpg?sign=1739318619-t1UwNLUtj1w3SCfjZJuwncYN0UfQU18s-0-9d2bce0e3e4cc26f9b5e43987f3f5e02)
对列表进行反转:
![067-07](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/067-07.jpg?sign=1739318619-mFkOW9PqElumZGw274MhWefslgJIF8gK-0-fc23dd2bd56a2a9fbef0646c37ac3955)
对列表进行排序:
![067-08](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/067-08.jpg?sign=1739318619-nt71wmkifZn8B2ppyLfIA4ntf1rNkKGl-0-b9e07762dd6a776a33a9a7ef58d1ff14)
用列表b
扩展列表a
:
![067-09](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/067-09.jpg?sign=1739318619-zjqfFJWYmnQ1gzIM9Zpy8mPrElznJRey-0-7f3f7d8d99b6c3502f8e75b7b09fa85c)
从列表中删除第一个2:
![067-10](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/067-10.jpg?sign=1739318619-0PBO6WEchhr8wrAN6ylurMLrtVYIDUlH-0-a8de284d244371a3b9728afae5cb768b)
删除列表的最后一项:
![068-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/068-01.jpg?sign=1739318619-yjircUQTyfv9jZApqc1eC3g0ELjZnqUC-0-d61ea7144d64b919d257f48bb4be6063)
现在你已经了解与列表相关的操作,下一节将介绍如何将Python列表用作栈。
3.1.10 栈和队列
栈是一种LIFO(Last In First Out,后进先出)的数据结构,其具有push()
和pop()
函数,分别用于添加和删除元素。栈中最新添加的元素位于顶部,因此是被删除的第一个元素。
以下代码说明了如何在Python中创建栈,以及从栈中删除和添加元素。创建一个Python列表(我们将其用作栈):
![068-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/068-02.jpg?sign=1739318619-IJ8xtnMMuKmmvfNDDrq8KgaGoVRvmMJn-0-459737f7c3a33a6b760c099c1a626f8f)
将5添加到栈:
![068-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/068-03.jpg?sign=1739318619-D1yNk6YO05aD0Y5QJk29EJX8O7EdCjap-0-3486a32c820a9f6a9d870b48aa0cc969)
从栈中删除最后一个元素:
![068-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/068-04.jpg?sign=1739318619-4cZiHwGUhDbDVpg5j0qoLHt8BrTDpYhe-0-49a58c2d8699ec51ab22f77867b010f6)
队列是FIFO(First In First Out,先进先出)的数据结构,其具有insert()
和pop()
函数,分别用于插入和删除元素。队列中最新添加的元素位于顶部,因此是被删除的最后一个元素。将新元素添加到已满的队列时,会删除队列中最早的元素。
以下代码说明了如何在Python中创建队列,以及如何将元素插入和追加到队列中。
创建一个Python列表(我们将其用作队列):
![068-05](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/068-05.jpg?sign=1739318619-PMm7eGEMH6nS9BAaUOJeBR4rH6z64ZHy-0-cd9b0c1e1490fd981e3c1ab109c66e6d)
在队列的开头插入5:
![068-06](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/068-06.jpg?sign=1739318619-XiirIy4f6VhIaJxBtdQ7e06OzSO7ts4X-0-737ebd7a74eace941674524d35998815)
从队列中删除最后一个元素:
![068-07](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/068-07.jpg?sign=1739318619-lf27sEvHcTve6HTQiZMR0VoL7ueAahrQ-0-a323fe6a93a1d7ec5209b757bfee191c)
上面的代码使用q.insert(0,5)
在开头插入元素,并使用q.pop()
从末端删除元素。但要牢记的是,Python中insert()
操作很慢,如果在位置0执行插入,需要将基础数组中的所有元素向下复制一个位置。因此可以将collections.deque
与coll.appendleft()
、coll.pop()
一起使用,其中coll
是Collection
类的代表。
前面,你已经学习了如何利用Python列表来模拟队列。但是Python中也有一个队列对象。以下代码片段说明了如何在Python中使用队列。
![069-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/069-01.jpg?sign=1739318619-UHnzQxbP2ArLpWi4uIuLiimExFNI6AVi-0-6f2e5b87ac1cf4075380b070f44b56a9)
下一节将介绍如何在Python中处理向量。
3.1.11 使用向量
向量是一维的数组,基于向量的操作包括加、减、内积等。清单3.6的MyVectors.py
说明了如何执行基于向量的操作。
清单3.6 MyVectors.py
![069-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/069-02.jpg?sign=1739318619-xYmIwt4WxeuWmG7As9lh58sUJmaovGTJ-0-330d76d8be46880601578a87381c7ea7)
清单3.6首先定义三个列表,每个列表代表一个向量。列表d1
和s1
分别表示v3
与v2
之差、v3
与v2
之和。p1
代表v3
和v2
的“内积”(也称为“点积”)。清单3.6的输出如下:
![069-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/069-03.jpg?sign=1739318619-CdcnigUOGJMl6mWvP5SIgnxATBLlxjE5-0-430b10c6e9a7fd58bd430bc1c3ab3c09)
3.1.12 使用矩阵
二维矩阵即为二维数组中的值,因此创建一个矩阵是非常方便的。举个例子,下面的代码块说明了如何获得二维矩阵中的元素:
![070-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/070-01.jpg?sign=1739318619-yuZsqp6cQsMayHOp0wa0jrfIR1j1eyKL-0-0bf688eeae2435e5189ef2300f7d3cd5)
上述代码的输出结果如下:
![070-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/070-02.jpg?sign=1739318619-FWtwKkdVVMT8yWhifN9MCzKqlUk62Nc0-0-50768b62ed7d5a81feca98c66969160a)
清单3.7的My2DMatrix.py
说明了如何创建和填充二维矩阵。
清单3.7 My2DMatrix.py
![070-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/070-03.jpg?sign=1739318619-4NXljzP5X1txFQIvTiRxCLLFXOZ6A6UH-0-8ee2335171ac28d18a1e2e82f14c3b15)
清单3.7首先初始化两个变量rows
和cols
,然后用rows
x cols
得到矩阵my2DMatrix
,其初始值为0。清单3.7的下一部分包含一个嵌套循环,把位置为(row,col
)的my2DMatrix
元素赋值为row*row+col*col
。清单3.7中的最后一行代码打印了my2DArray
的内容。清单3.7的输出如下:
![070-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/070-04.jpg?sign=1739318619-xIYZrAVNa9JN0fbTeKso96nUJQxndsPB-0-5f58a6e3d5d96fa0eca3654b3548939b)
3.1.13 使用NumPy
库处理矩阵
NumPy
库(可以通过pip
安装)支持矩阵对象,可以处理Python中的矩阵。以下示例说明了NumPy
的一些特性。
初始化矩阵m
,然后显示其内容:
![071-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/071-01.jpg?sign=1739318619-g9hdqjrI18XvBfJmgLv6iVY7kFrOvcNI-0-272f140f928c8261eca75902347cec0f)
下面的代码片段返回矩阵m
的转置:
![071-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/071-02.jpg?sign=1739318619-wGNfNGDRnOHEXg9SMCRHZk6pICKbXQXe-0-55a0e55a3e964accf5865df48b017c43)
下面的代码片段返回矩阵m
的逆(如果存在):
![071-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/071-03.jpg?sign=1739318619-3JnmLzTGvH0g1x2OaociiR6MmAOmBEgm-0-487b95529ff2d0e7ab905f767b6ff7f1)
下面的代码片段定义向量y
,然后计算乘积m*v
:
![071-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/071-04.jpg?sign=1739318619-FzCNco6mHUDh4CFbyt8ARwlXvrrhKq9K-0-b2247ad216abf6dee07f68624edd4895)
下面的代码片段导入numpy.linalg
子包,然后计算矩阵m
的行列式:
![071-05](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/071-05.jpg?sign=1739318619-GBRmjReCKTe0s9tNqo7NMjUQSHoJfmOt-0-9d5bedb0ddd6005329bd6b5b8468ff01)
下面的代码片段查找矩阵m
的特征值:
![071-06](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/071-06.jpg?sign=1739318619-NXuqGnriAlX8OArJTsN9nJhNLILrTDMq-0-5daee3631ff20283ad93c4c6cf337dd7)
下面的代码片段查找方程m*x=v
的解:
![071-07](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/071-07.jpg?sign=1739318619-4LwsjAtqPSnrVG8M5n2lC2YD2d5MciaA-0-8d933720c84226e7ea8a0697d1be9887)
除了上述示例之外,NumPy
包还提供了其他功能,你可以在网上搜索相关文章和教程来了解这些功能。