入门 Python 语言:数据结构 - 列表(数组)
目录
✨前言✨
本系列文章目的在于将 Python 的基础内容完全夯实,最终目的是为后期的深度学习在算法上有一定的铺垫,前期在学习数学的过程中也会有很大的帮助,相对于 C++ 来说 Python 有自身的优势,文末会有 Python 的优势对比于 C++ 的维度点说明,我已经先写过 C++的基础使用 了,两种语言各自有各自的优势,我们要根据具体的需求来分析使用哪种语言更为方便,其它的语言暂时不在考虑范畴之内,我们的目标是AI深度学习。
前置环境与代码结构文章:
📚本篇目标
- 让初学者了解 Python 中列表(数组)这一重要数据结构的基本概念。
- 掌握列表的定义、创建方法以及元素的访问和修改操作。
- 熟悉列表的常用操作,如切片、追加、插入、删除元素、排序和反转等。
- 理解嵌套列表的结构和使用方式。
🔥重难点说明
重点
- 列表的基本操作,包括元素的访问、修改、追加、删除等,这些操作是日常编程中处理列表数据的基础。
- 列表切片的使用,它可以灵活地获取列表的部分元素,是非常实用的技巧。
- 列表排序和反转操作,能帮助对列表数据进行整理和处理。
难点
- 列表切片的参数理解和运用,尤其是起始索引、结束索引和步长的组合使用。
- 嵌套列表的操作,包括多层索引的使用和对嵌套结构的理解,容易在操作中出现索引越界等错误。
📖学习正文
列表定义与创建
在 Python 中,列表是一种有序、可变的数据结构,使用方括号 []
来定义。可以包含不同类型的元素。
# 创建一个空列表
empty_list = []
print("空列表:", empty_list)
# 创建包含元素的列表
fruits = ["apple", "banana", "cherry"]
print("水果列表:", fruits)
执行效果:
空列表: []
水果列表: ['apple', 'banana', 'cherry']
列表元素访问与修改
可以使用索引来访问列表中的元素,索引从 0 开始。也可以通过索引对列表元素进行修改。
fruits = ["apple", "banana", "cherry"]
# 访问第一个元素
first_fruit = fruits[0]
print("第一个水果:", first_fruit)
# 修改第二个元素
fruits[1] = "grape"
print("修改后的列表:", fruits)
执行效果:
第一个水果: apple
修改后的列表: ['apple', 'grape', 'cherry']
列表常用操作
列表切片
列表切片用于获取列表的部分元素,语法为 list[start:stop:step],其中 start 是起始索引,stop 是结束索引(不包含),step 是步长。
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 获取索引 1 到 3 的元素
slice1 = numbers[1:4]
print("切片 1:", slice1)
# 从索引 0 开始,每隔一个元素取一个
slice2 = numbers[0::2]
print("切片 2:", slice2)
执行效果:
切片 1: [2, 3, 4]
切片 2: [1, 3, 5, 7, 9]
列表追加、插入、删除元素
fruits = ["apple", "banana"]
# 追加元素
fruits.append("cherry")
print("追加元素后的列表:", fruits)
# 插入元素
fruits.insert(1, "grape")
print("插入元素后的列表:", fruits)
# 删除指定元素
fruits.remove("banana")
print("删除元素后的列表:", fruits)
# 删除指定索引的元素
del fruits[0]
print("再次删除元素后的列表:", fruits)
执行效果:
追加元素后的列表: ['apple', 'banana', 'cherry']
插入元素后的列表: ['apple', 'grape', 'banana', 'cherry']
删除元素后的列表: ['apple', 'grape', 'cherry']
再次删除元素后的列表: ['grape', 'cherry']
列表排序、反转
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
# 排序
numbers.sort()
print("排序后的列表:", numbers)
# 反转
numbers.reverse()
print("反转后的列表:", numbers)
执行效果:
排序后的列表: [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
反转后的列表: [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]
嵌套列表
嵌套列表是指列表中的元素也是列表。可以通过多层索引来访问嵌套列表中的元素。
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# 访问第二行第三列的元素
element = matrix[1][2]
print("嵌套列表中的元素:", element)
执行效果:
嵌套列表中的元素: 6
💻练习题
单选题-5
1. 以下哪种方式可以创建一个空列表?
A. list {}
B. []
C. ()
D. {}
2. 对于列表 my_list = [1, 2, 3, 4, 5],my_list[1:3] 的结果是?
A. [1, 2]
B. [2, 3]
C. [3, 4]
D. [2, 3, 4]
3. 要在列表 fruits = ["apple", "banana"] 的末尾添加元素 "cherry",应使用的方法是?
A. insert ()
B. append ()
C. remove ()
D. pop ()
4. 执行以下代码后,列表 numbers 的结果是?
python
numbers = [1, 2, 3]
numbers.reverse()
A. [1, 2, 3]
B. [3, 2, 1]
C. [2, 1, 3]
D. [1, 3, 2]
5. 对于嵌套列表 nested_list = [[1, 2], [3, 4]],访问元素 4 的正确方式是?
A. nested_list [0][1]
B. nested_list [1][0]
C. nested_list [1][1]
D. nested_list [0][0]
多选题-3
1. 以下属于列表常用操作方法的有?
A. append ()
B. insert ()
C. sort ()
D. reverse ()
2. 列表切片my_list[2:5] 可以获取列表 my_list 中哪些索引的元素?
A. 2
B. 3
C. 4
D. 5
3. 关于列表的说法,正确的是?
A. 列表中的元素可以是不同的数据类型
B. 列表是可变的数据结构
C. 列表的索引从 1 开始
D. 可以使用负数索引访问列表元素
判断题-2
列表的 sort() 方法会返回一个新的排序后的列表,原列表不变。( )
可以使用 del 语句删除列表中的元素。( )
代码题-1
编写一个 Python 程序,创建一个包含 1 到 10 的列表,然后将列表中的偶数元素删除,最后打印剩余的列表。
📝答案解析
单选题
- 答案:B
- 在 Python 中,使用
[]
可以创建一个空列表,所以选 B。选项 A 语法错误;选项 C()
用于创建元组;选项 D{}
用于创建字典。
- 在 Python 中,使用
- 答案:B
- 列表切片
my_list[1:3]
表示从索引 1 开始(包含)到索引 3 结束(不包含),所以结果是[2, 3]
,选 B。
- 列表切片
- 答案:B
append()
方法用于在列表末尾添加元素,所以选 B。insert()
用于在指定位置插入元素;remove()
用于删除指定元素;pop()
用于删除并返回指定索引的元素。
- 答案:B
reverse()
方法会将列表中的元素反转,所以numbers
列表反转后变为[3, 2, 1]
,选 B。
- 答案:C
- 嵌套列表
nested_list = [[1, 2], [3, 4]]
中,元素 4 在第二行(索引为 1)第三列(索引为 1),所以访问方式是nested_list[1][1]
,选 C。
- 嵌套列表
多选题
- 答案:ABCD
append()
用于追加元素,insert()
用于插入元素,sort()
用于排序,reverse()
用于反转,它们都是列表常用的操作方法,所以选 ABCD。
- 答案:ABC
- 列表切片
my_list[2:5]
表示从索引 2 开始(包含)到索引 5 结束(不包含),所以会获取索引为 2、3、4 的元素,选 ABC。
- 列表切片
- 答案:ABD
- 列表中的元素可以是不同的数据类型,列表是可变的数据结构,可以通过索引修改元素;列表的索引从 0 开始;可以使用负数索引从列表末尾开始访问元素。所以选 ABD。
判断题
- 答案:错误
- 列表的
sort()
方法会直接对原列表进行排序,不会返回新的列表,原列表会被修改。所以该说法错误。
- 列表的
- 答案:正确
- 可以使用
del
语句删除列表中的元素,例如del my_list[0]
可以删除列表my_list
中的第一个元素。所以该说法正确。
- 可以使用
代码题
numbers = list(range(1, 11))
new_numbers = []
for num in numbers:
if num % 2 != 0:
new_numbers.append(num)
print(new_numbers)
首先使用 range(1, 11) 生成 1 到 10 的整数序列,再用 list() 函数将其转换为列表。然后遍历列表,将奇数元素添加到新列表 new_numbers 中,最后打印新列表。
总结
本文围绕 Python 中的列表(数组)展开,详细介绍了列表的定义、创建、元素访问与修改,以及常用操作如切片、追加、插入、删除元素、排序和反转等,还讲解了嵌套列表的使用。通过示例代码展示了各操作的执行效果,并通过练习题巩固了所学知识。掌握列表的使用对于 Python 编程至关重要,希望初学者能熟练运用这些知识处理各种列表数据。
Python的优势对比于 C++ 的维度点说明
对比维度 | Python 优势 | C++ 情况 |
---|---|---|
性能效率 | 1. 开发效率高:代码简洁,语法灵活,能够用较少的代码实现相同的功能,缩短开发周期。 2. 有高性能库支持:对于计算密集型任务,可以使用如 NumPy、Pandas 等高性能库,它们底层使用 C 或 Fortran 实现,能在一定程度上弥补 Python 执行速度慢的问题。 | 1. 开发效率低:代码相对冗长,需要编写更多的代码来实现相同功能,开发周期较长。 2. 开发难度大:需要手动管理内存,容易出现内存泄漏等问题,对开发者要求较高。 |
底层控制能力 | 1. 代码编写简单快速:无需关注底层硬件细节,能让开发者更专注于业务逻辑的实现,快速搭建应用原型。 2. 适合快速迭代开发:在应用开发过程中,能够快速对代码进行修改和调整,适应不断变化的需求。 | 1. 代码编写复杂:需要对底层硬件有深入了解,编写代码时要处理很多底层细节,开发难度大。 2. 开发周期长:由于需要关注底层,代码的修改和调整相对困难,不适合快速迭代开发。 |
语言特性 | 1. 语法简洁易懂:代码可读性高,易于学习和上手,降低了编程门槛,适合初学者。 2. 动态类型灵活:在编写代码时无需提前声明变量类型,能够根据需要灵活赋值,提高了代码的编写效率。 | 1. 语法复杂:学习成本较高,对于初学者来说有一定难度。 2. 静态类型不够灵活:在编写代码时需要提前声明变量类型,不够灵活,修改代码时可能需要对类型进行调整。 |
可移植性 | 1. 跨平台部署方便:只要安装了相应的 Python 解释器,代码可以在不同操作系统上轻松运行,无需重新编译。 2. 云服务支持好:很多云服务平台都提供了 Python 运行环境,方便将 Python 应用部署到云端。 | 1. 跨平台编译麻烦:不同操作系统的编译器和运行时环境可能存在差异,需要针对不同平台进行编译和调试。 2. 云服务集成复杂:将 C++ 应用部署到云服务平台时,需要处理更多的底层配置和依赖问题。 |
生态系统和工具链 | 1. 库丰富且易用:拥有大量的开源库和框架,涵盖了数据分析、机器学习、Web 开发等多个领域,能够快速实现各种功能。 2. 社区活跃:有庞大的开发者社区,遇到问题可以很容易找到解决方案和技术支持。 | 1. 库学习成本高:虽然有很多专业级库,但部分库的学习曲线较陡,使用起来有一定难度。 2. 社区相对较小:相比 Python 社区,C++ 社区规模相对较小,获取技术支持和解决方案的渠道相对较少。 |
安全性和稳定性 | 1. 内置安全机制:有一些内置的安全机制,如异常处理机制,能够在程序出现错误时进行捕获和处理,避免程序崩溃。 2. 代码审查相对容易:简洁的语法和动态类型使得代码结构相对简单,在代码审查时更容易发现问题。 | 1. 手动管理易出错:手动管理内存和资源容易出现错误,如内存泄漏、悬空指针等,影响程序的稳定性和安全性。 2. 代码审查复杂:由于语法复杂,代码结构可能比较复杂,在代码审查时需要花费更多的时间和精力。 |