![机器学习入门: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=1739671945-Rdb1ISWMYcBIS4mHoogMDsuc9W1BETxz-0-6411dd0a111a8ec40b79b624b4616d09)
你可以将多个变量分配给一个列表,前提是变量的数量和类型要与列表结构匹配。举个例子:
![058-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/058-01.jpg?sign=1739671945-taEKPTteWhrjswmbbwK7q2tyVIiCOqZS-0-0a32bc6906040caf6e72da23f4fa3b9f)
以下示例说明了如何在更复杂的数据结构中给变量赋值:
![058-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/058-02.jpg?sign=1739671945-911PXoeZr1BgXriazNN2g1eUUofuiUvW-0-10707e28e104b991e773547770505718)
如果要获取上述代码块中date1
元素的年/月/日组成部分,可进行如下操作:
![058-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/058-03.jpg?sign=1739671945-xMa5jEsp4z3H18bLSaFdaSrSBYs92wfq-0-9177107a6ccf8478baaa3e7c9fab6d62)
如果变量的数量和/或结构与数据不匹配,则会显示一条错误消息,如下所示:
![058-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/058-04.jpg?sign=1739671945-QRN1XxBf6bOhbAriDRSctglj8feH0eE3-0-ca2893677e551ed9175c0b9d1cd9e100)
如果指定的变量数少于数据的项数,你将看到一条错误消息,如下所示:
![059-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/059-01.jpg?sign=1739671945-8T4VWbb0Juispq0cfPBmNhdj0C9cFGFP-0-4bb3c8d4711b9ec1f88dd5bfdd7a72d8)
1. 反转和排序列表
Python的reverse()
方法可反转列表的内容,如下所示:
![059-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/059-02.jpg?sign=1739671945-Oo4chdnqWR9MufNopF7ht7GOJsi322cC-0-b137423db46928d881049fc6a74d9dbf)
Python的sort()
方法可对列表进行排序:
![059-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/059-03.jpg?sign=1739671945-A9Cw71hISTVbszI7o7V4lcXn3IhcYy5G-0-1a19fd839136d1fa36c44fb6601550e3)
你可以对列表进行排序,然后反转其内容,如下所示:
![059-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/059-04.jpg?sign=1739671945-r02iBT9s8JSfkDuWEXbuM3ElLdDP9TGu-0-64ddc8bdeb95d93394f69193d2c947ce)
另一种反转列表的方法如下所示:
![059-05](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/059-05.jpg?sign=1739671945-KBMrwcwiJu0fcPrCytAFbi8BjpcuEHJD-0-8ff429ba497d20a7a4322c6551b24dfe)
需要牢记的是,reversed(array)
是可迭代的,而且它并不是列表。但以下代码片段可以将一个反转的数组转换为列表:
![059-06](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/059-06.jpg?sign=1739671945-hxr2XK43B3BXGW7Hyjgx0k0jl8rXRumG-0-8b7dd4b3b5b2463efecc8e3ac81d9637)
清单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=1739671945-3wkMdfguoHGAjVRYxMdhI6ZGIOSVXB8l-0-688d0ec99872253c7d9ed90521a3c6dd)
清单3.1的输出如下所示:
![060-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/060-01.jpg?sign=1739671945-OgaNp7oXtBzfKhapHc3OEzJ7r73g9qF1-0-7210a390a77ea856c4ed3cfe4f3b0883)
排序的数字列表中,第一个数字是最小值。如果反转排序列表,则第一个数字是最大值。以下代码说明了有很多方法可以反转列表:
![060-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/060-02.jpg?sign=1739671945-1TnBbFehnBsVgjGl5jaovlowztOWjyHi-0-63b0447db6ad4aa3f7a4d1d0906a682d)
上述代码块的输出如下所示:
![060-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/060-03.jpg?sign=1739671945-fAbJ7qmQjiwaS6iFnTvbh2BJPWPxPSLR-0-deef44177337bd507e2bc38ff1e39d30)
第二种(更好的)方法对列表进行排序:
![060-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/060-04.jpg?sign=1739671945-kPlERscVtrhRQfsQd1TYCTNNMdkor8S6-0-cd9fdb9d8d13c06671aadce2439b4511)
第三种列表排序方法涉及sort()
方法的内置函数:
![060-05](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/060-05.jpg?sign=1739671945-mKnI1cdLt5cishx7qErdx8RowCHpYftu-0-fa552b414abf429b656cc03efb7631bb)
当你不想修改列表的原始顺序,或者想在一行上编写多个列表操作时,上述代码非常有用。
2. 过滤列表
Python可以过滤一个列表(也称作列表解析),如下所示:
![060-06](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/060-06.jpg?sign=1739671945-AKez876r76MHOGp7d5EhmpxC2bPd1FBk-0-db46cec9b3a3e85484dd1694b3877a0c)
你也可以在过滤器中指定if/else
逻辑,如下所示:
![060-07](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/060-07.jpg?sign=1739671945-6uKWlysZGa3Ae4WxvF7LGqLfnC2mnDkp-0-628261beb0236f31fbb907a435d830b3)
上述代码块的输出如下所示:
![060-08](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/060-08.jpg?sign=1739671945-Chgw0uhbU2bWjCnj33Dvt4yVZKthTFXM-0-bd963e0f41581f5fb69fc73fa3da6a04)
3. 数字和字符串的排序列表
清单3.2的Sorted1.py
脚本用于判断两个列表是否为排序列表。
清单3.2 Sorted1.py
![061-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/061-01.jpg?sign=1739671945-uuyijoZCCfk9veqWDJWVT8NOBrtwd6Ou-0-141820b03abaed58e18655823dbc6e43)
清单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=1739671945-e9TC7Qdu74OBCvySlIwVIQuYZzujHvMY-0-b73ed14b2d04f286ddb632d681144568)
请注意,如果对字符串列表进行排序,输出结果是区分大小写的,大写字母出现在小写字母之前。这是因为ASCII的核对顺序把大写字母(十进制65到十进制91)放在小写字母(十进制97到十进制127)之前。下例示例可具体解释说明:
![061-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/061-03.jpg?sign=1739671945-570827TPLmY2d22eRqHqeswC9405HHZ8-0-645fcb54d957131f81eda82d95a72116)
你还可以设定反转选项,用反向的顺序对列表进行排序:
![061-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/061-04.jpg?sign=1739671945-9R9TSABkSO5JhIYZuUT7maHPxkdL7GjG-0-ba9b7c43554bef7b529a748fa695db8f)
你甚至可以根据列表中每一项的长度对列表进行排序:
![061-05](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/061-05.jpg?sign=1739671945-Vjw61XneUcaHWWgGVrAode8oEPIfgwSn-0-13a4fb95a7f64b3ba19a3804cc9a68b4)
如果想要在排序操作中将大写字母视为小写字母,可以设定str.lower
,如下所示:
![061-06](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/061-06.jpg?sign=1739671945-3Ganedxb1jp5rwCiqwfNH4pJc5tDpVBL-0-96d45b4e9cbec932e63345b563d05a70)
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=1739671945-k5OqVkHpQ3xyuxOvdgp7HYYnsCWJcL0w-0-ea76836d71ab96742574407273a46932)
清单3.3的输出结果如下所示:
![062-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/062-02.jpg?sign=1739671945-7xqDqKdct1JO0ndCUfxoXXo1RNEJxK98-0-a0832af9fde6bc09c2c766fe37a14a1e)
3.1.2 列表中的表达式
以下构造类似for
循环,但这个循环末尾没有冒号“:”字符:
![062-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/062-03.jpg?sign=1739671945-dMCbYkH79OTjQCnesgGV00rhrlkGMMPB-0-e48ceefa5ca29393ac9ab572bcf6f7e6)
3.1.3 连接字符串列表
Python提供了join()
方法来连接文本字符串,如下所示:
![062-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/062-04.jpg?sign=1739671945-0fGWFxCmBnRtfwakWfn0RO0KPXBHd4yR-0-6b5605589fa0c187ef5c4a8620363a32)
有很多方法可以连接一组字符串,然后打印结果。下面这种是效率最低的方法:
![062-05](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/062-05.jpg?sign=1739671945-PUIGR1NsNJE7EQBIbBm8I9OvaYspPY0f-0-16d40f3c93d17e346eadafb42377fd05)
以下两种都是更佳的方法:
![063-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/063-01.jpg?sign=1739671945-CCWt5mtUXJju8btKlWHhoYxfbimCm9jm-0-566401e5682a3b297f5754c99db1209e)
3.1.4 Python中的range()
函数
本节你将了解Python中可用于遍历列表的range()
函数,如下所示:
![063-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/063-02.jpg?sign=1739671945-cbxlolBZaZzKmlIZZUbnxHvNxzOr0EG3-0-acccfa103a8e59cc281c838b8f63e3d9)
你可以使用for
循环遍历字符串列表,如下所示:
![063-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/063-03.jpg?sign=1739671945-de1Hb46d9ZaroCby76EIinN9eeN8sCkD-0-3cee98191e26fb3b5e6fe56fa6a26310)
你可以使用for
循环遍历字符串列表,并显示更多详细信息,如下所示:
![063-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/063-04.jpg?sign=1739671945-DyvGXU1elYt3blPC0y3pJ5nentbnzDuM-0-0f66b15427cf7bc7d63328fb81d88056)
上面的输出结果显示列表x
中每个字符串的长度,后跟字符串文本内容。
对数字、大写和小写字母计数
清单3.4的CountCharTypes.py脚本对字符串中数字和字母进行计数。
清单3.4 Counter1.py
![063-05](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/063-05.jpg?sign=1739671945-tjY9r1VVILdGs10wz1KaYgQRpOvP75aa-0-1b0f67e84f039c8772debebe66d9a9f3)
清单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=1739671945-M0SoCIW13OuCwWIxJHVTipmJIRAW16n6-0-84cfb52092ebdb75599520c1b2d1676c)
3.1.5 数组和append()
函数
Python有一个数组类型(import array
),本质上是一个异构列表。但是除了略微节省内存使用之外,该数组类型与列表类型相比没有任何优势。你也可以定义异构数组:
![064-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/064-02.jpg?sign=1739671945-An9bZX84zySWjjTpeVnhCDIChkwE4MPg-0-cdeddeb08acc82f62b4ce2f61d8c6807)
你可以将新元素追加至一个列表中:
![064-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/064-03.jpg?sign=1739671945-IbZpKpHOeVO3YKucGrtiq8U1TwDX9WwX-0-d7944321e1cfa758594705dca0c1a6c5)
你可以将简单的变量赋值给列表中的元素,如下所示:
![064-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/064-04.jpg?sign=1739671945-oshAMjLwlasBAu4QMvA2xkAkwHGaOyka-0-ba125a941d7cf808d689ad09658cfdcf)
上述代码的输出如下所示:
![065-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/065-01.jpg?sign=1739671945-0UYUSROhmg16y2TJH8yfy9HPAY2WFz7s-0-31f561a252787cfef009d4f3e6aedf7f)
Python中split()
函数比前面的示例更便捷(尤其是在元素数未知或可变的情况下),你将在下一节看到split()
函数的示例。
3.1.6 使用列表和split()
函数
你可以使用Python的split()
函数拆分文本字符串中的单词,并用这些单词填充一个列表,示例如下:
![065-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/065-02.jpg?sign=1739671945-rPHDwzxrglaIxMgrdvaPyYsO6WXGFK2k-0-46bb6f4c951af8c5bd39174c680ffb10)
打印文本字符串中单词列表的一个简易方法如下所示:
![065-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/065-03.jpg?sign=1739671945-qcBsK2cMUeQGGlxTuslh5KeId4mKvxNP-0-661f800be3fa9e9087a3bffa786a6a0a)
你可以按以下方法搜索字符串中的单词:
![065-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/065-04.jpg?sign=1739671945-mVL2MLdPspYhuE6R2Lbwqpv70CCguoKv-0-6d659f8485c52537dea0a87ffd58420c)
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=1739671945-ai4kTQFVA3auvSXiLl4PLuOG7RpMKSZU-0-26b72e1395f5a00d16a09d019b6c5e61)
清单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=1739671945-vOmLTXYATrxrGSCZEuIsIuGnQ6tAQjnN-0-0c735617e2101cd0a46b558398599a49)
3.1.8 遍历成对的列表
Python支持成对的列表操作,这意味着可以执行类似于向量的操作。以下代码片段将每个列表元素乘以3:
![066-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/066-02.jpg?sign=1739671945-HY37fU6pcqipx9I1YwOF8JeJCYXOYtvG-0-2e8bcfc5b9f86a3d6b8c91a8f4900f6c)
创建一个新列表,包含原始元素,以及原始元素乘以3的值:
![066-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/066-03.jpg?sign=1739671945-FTL2iIhjM646sauq3XlNZzONStfGaXji-0-03353940db267e75d30881a13194c007)
计算两个列表中每对数字的乘积:
![066-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/066-04.jpg?sign=1739671945-72wmaE8SmYSwcW0zYlSpJU3UtLeSWieb-0-d6b2035ab63f401263c175a249950970)
计算两个列表中每对数字的总和:
![066-05](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/066-05.jpg?sign=1739671945-amoAFfap0L1mXtGazOCAmCKryjCItr2n-0-7ea21c8795eb41040dee06c19b198091)
计算两个列表的每对元素的乘积:
![066-06](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/066-06.jpg?sign=1739671945-MsuZjN1g30MfsGcnryDZxnDdKi0FIRht-0-7541930a4af51093b9e53b9c6400e0f5)
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=1739671945-PTlrmORnZVXT17WZ9QXyxmbGGgcZAT52-0-016aeda3e9e74049d156ffedee571758)
显示1和2的出现次数:
![067-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/067-01.jpg?sign=1739671945-ACxUrtPhoTndZk8ECtSM1BcN4DlRG8NF-0-3ac847992958301992fd75f7469a48d1)
在位置3处插入-8:
![067-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/067-02.jpg?sign=1739671945-En8ZKk2ymlzqV773Ypbv0Z8fX5wLyHOk-0-bf39ca65d722f6cb078375d1e2cd2555)
从例表中删除3:
![067-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/067-03.jpg?sign=1739671945-5xKLS0A91IyqFHUdRNdMPw0NiYccfXPA-0-2cfd9084001b95a638d73fdc4374dcee)
从例表中删除1:
![067-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/067-04.jpg?sign=1739671945-1cj2H1hGTMPgJrqZVy7xZpdwOmtX6tX4-0-00c4fecee4bf74cd6131868325a45c9f)
将19添加至列表:
![067-05](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/067-05.jpg?sign=1739671945-o8O1Ct05iGzYJTqxHxgETOroFnUWexl2-0-43ad0c684d00623442b45eaa26410f08)
打印列表中19的索引:
![067-06](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/067-06.jpg?sign=1739671945-osaE09LSWaPavjERWyA1vwTGoFCFoDaA-0-aba5a164a91ff15bb95a3b80fca8bfa6)
对列表进行反转:
![067-07](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/067-07.jpg?sign=1739671945-EgL9nQcf40WMWXMlS33xf8bJ2EXkqJHb-0-0cb5a9de2b5e6b30357a68d63dc53eb0)
对列表进行排序:
![067-08](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/067-08.jpg?sign=1739671945-yQ6tJ5Qi3w4Ecb6BJiAh1JE7qw30Jbjy-0-dbcc30f0b2eb39578023960fbe38b6e4)
用列表b
扩展列表a
:
![067-09](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/067-09.jpg?sign=1739671945-iRguc21sZUzndXr2m8QLcjTK9AU6Hi7m-0-963f51582372d9d84a10c4de7759a468)
从列表中删除第一个2:
![067-10](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/067-10.jpg?sign=1739671945-cSPmaO0uCQv3Liffyd8e9uOL3O2OMspk-0-a6f7e6e569ee5c18456bfb893aec70b0)
删除列表的最后一项:
![068-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/068-01.jpg?sign=1739671945-XbqQRRB3pONQIkwqiWkGF8NkjJaxaiN4-0-1ce5fcac01c14eecafd69a3527700eb0)
现在你已经了解与列表相关的操作,下一节将介绍如何将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=1739671945-a9pHkJRFmz56XPB0Qwl1ARXTdO2xgPr0-0-1ee6b70d12464e75c745706401eb43e5)
将5添加到栈:
![068-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/068-03.jpg?sign=1739671945-cxrqpcmC8eCT3ursKQQm54Y7gaUSHdsv-0-33d58f557f7184b84b7ace5649861909)
从栈中删除最后一个元素:
![068-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/068-04.jpg?sign=1739671945-DCW1gYgQSDaManNGYXcI4GNJYDAa50df-0-7a8b2af2c99fc42bbdd3d22f73ab247b)
队列是FIFO(First In First Out,先进先出)的数据结构,其具有insert()
和pop()
函数,分别用于插入和删除元素。队列中最新添加的元素位于顶部,因此是被删除的最后一个元素。将新元素添加到已满的队列时,会删除队列中最早的元素。
以下代码说明了如何在Python中创建队列,以及如何将元素插入和追加到队列中。
创建一个Python列表(我们将其用作队列):
![068-05](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/068-05.jpg?sign=1739671945-gV0JP3sexv0OS45wkqmnhCE72uyU8tlU-0-74acca237dce8e4d990b2ca43bdf059a)
在队列的开头插入5:
![068-06](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/068-06.jpg?sign=1739671945-3fAtZKoQTxWJAPcPWKZVf49Gk66KGyQH-0-85b7ca2b2ed54d448e6e62f216c0dfda)
从队列中删除最后一个元素:
![068-07](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/068-07.jpg?sign=1739671945-ZEAadA55Aenf184e3bbjvJh2beXOlLyv-0-22024f4974165b53491e7ab472b61287)
上面的代码使用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=1739671945-E6V8xyxItJJEAUfzr4bin2iJuPHxkZ3A-0-938c7906a51dabb3ea693fafeae3b680)
下一节将介绍如何在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=1739671945-rKPrt4JNLLfinE1Ehr6MZiPZLA3OOGBH-0-81902a4127fc73ca5c2a95066a1933ab)
清单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=1739671945-2RfvHThpTa6BDo9NXWGQEyfiPccPy1uP-0-3e359e131b5bc2c058180821767e6dee)
3.1.12 使用矩阵
二维矩阵即为二维数组中的值,因此创建一个矩阵是非常方便的。举个例子,下面的代码块说明了如何获得二维矩阵中的元素:
![070-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/070-01.jpg?sign=1739671945-w1XqdZSr9LWmFbMYKk0y0crhQYqwCnJx-0-879a6212258b23379201ec53fba71649)
上述代码的输出结果如下:
![070-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/070-02.jpg?sign=1739671945-3XUEvbhA757xOcvQE3d100mO87dNAu1C-0-94681c52b4f285e74e2332f402d6e137)
清单3.7的My2DMatrix.py
说明了如何创建和填充二维矩阵。
清单3.7 My2DMatrix.py
![070-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/070-03.jpg?sign=1739671945-wQ3L2Qdz7NUDGvb7zFRKKoEACsqrhZVu-0-f63f22ac6ad905a1582515e5b5a4f779)
清单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=1739671945-pP5ziYZKWfzeE805S6s4gSjV9ZmBJkd3-0-62b5e4cfa48fb61be632060fd9634f63)
3.1.13 使用NumPy
库处理矩阵
NumPy
库(可以通过pip
安装)支持矩阵对象,可以处理Python中的矩阵。以下示例说明了NumPy
的一些特性。
初始化矩阵m
,然后显示其内容:
![071-01](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/071-01.jpg?sign=1739671945-qxQ5JuQwWicHWBeti6Z1tgEQzp8txTqR-0-22e4d2f10bfddc4ba7e50bfc43110706)
下面的代码片段返回矩阵m
的转置:
![071-02](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/071-02.jpg?sign=1739671945-qmOcxXIO0PknlSDgkYTGPFUydk1vVnzm-0-303726661c2cdba30fe3f6a78efd1b6c)
下面的代码片段返回矩阵m
的逆(如果存在):
![071-03](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/071-03.jpg?sign=1739671945-eQy0qveg2A3pfoKIiPQAexktFPvgsIA8-0-ab95c56aab97c6938c033f9fb214c170)
下面的代码片段定义向量y
,然后计算乘积m*v
:
![071-04](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/071-04.jpg?sign=1739671945-IZKaBIBFXXGsCE9EZbLO6YvWoHO5DYSV-0-12c1e1fc62ac32054354ee6b31559b81)
下面的代码片段导入numpy.linalg
子包,然后计算矩阵m
的行列式:
![071-05](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/071-05.jpg?sign=1739671945-73Uv4l2siNrRKrdxIAQzeTAroZ6cKOyN-0-aafba6c5a1e3c2919416d7821cb3567c)
下面的代码片段查找矩阵m
的特征值:
![071-06](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/071-06.jpg?sign=1739671945-gTyKwHRYaGDt3XRyukNwE4HoEdrh647t-0-a55e088b974d9573c26ec516743c9649)
下面的代码片段查找方程m*x=v
的解:
![071-07](https://epubservercos.yuewen.com/8036B4/21821545908478506/epubprivate/OEBPS/Images/071-07.jpg?sign=1739671945-H2EA9eMqtyQ0m7VEFA0awAazNyMn2Q7l-0-2964bb3db9735bcf523167bac003b242)
除了上述示例之外,NumPy
包还提供了其他功能,你可以在网上搜索相关文章和教程来了解这些功能。