列表
在 JavaScript 中,数组是存储多个值的最重要的数据结构,我们使用方括号来创建和操作数组。Python 的列表与 JavaScript 数组非常相似,但提供了更多强大的功能和更优雅的语法。
创建
JavaScript 中创建数组很简单:
Python 的列表创建语法完全相同:
Python 列表同样支持混合数据类型,这得益于 Python 的动态类型系统。
使用构造函数创建
JavaScript 可以使用Array()
构造函数创建数组:
Python 也有list()
构造函数,可以从各种可迭代对象创建列表:
访问元素
JavaScript 中使用索引访问数组元素:
Python 的访问方式相同,但支持负索引这个强大特性:
负索引让我们能够很方便地从列表末尾访问元素,这在 JavaScript 中需要使用array[array.length - 1]
的方式。
长度
JavaScript 使用.length
属性:
Python 使用len()
函数:
比较
JavaScript 数组的比较主要基于引用:
Python 列表的比较与 JavaScript 数组不同。Python 的==
会比较列表内容,而 JavaScript 比较的是引用:
关于==
和is
的详细差异,请参考布尔值章节的比较运算符部分。
元素查找
检查元素存在
JavaScript 中使用.includes()
方法:
Python 使用更直观的in
关键字:
索引查找
JavaScript 使用.indexOf()
方法查找元素的索引:
Python 使用.index()
方法,但不存在时会报错:
计数
JavaScript 需要使用filter()
方法来计数:
Python 提供了简洁的.count()
方法:
切片
JavaScript 使用.slice()
方法来获取数组的部分:
Python 的切片语法 [开始:结束]
更简洁优雅:
需要注意的是,Python 切片遵循"含左不含右"的规则,即numbers[2:5]
包含索引 2、3、4 的元素,但不包含索引 5 的元素。
步长切片
Python 切片还支持步长参数,完整语法是 [开始:结束:步长]
,这是 JavaScript 所没有的:
修改元素
与 JavaScript 数组一样,Python 列表支持通过索引直接修改元素,但 Python 还支持通过切片批量修改多个元素。
JavaScript 中修改数组元素:
Python 提供了更简洁的语法:
替换时改变列表长度
Python 列表切片赋值可以改变列表长度:
添加元素
append 和 extend
JavaScript 使用.push()
方法,可以添加一个或多个元素:
Python 区分单个元素添加和多个元素添加,分别使用.append()
和.extend()
方法:
insert 和位置插入
JavaScript 使用.unshift()
方法在数组开头添加元素,用.splice()
方法在指定位置插入:
Python 的.insert()
方法可以在任意位置插入:
连接操作
JavaScript 中连接数组需要使用.concat()
方法:
Python 使用+
运算符更简洁:
重复操作
与字符串类似,Python 列表也支持使用*
运算符进行重复操作。
JavaScript 中重复数组需要使用循环或其他方法:
Python 使用*
运算符非常简洁:
重复操作的注意事项
在创建包含可变对象的列表时需要特别小心:
删除元素
remove 和 pop
JavaScript 中没有直接删除值的方法,通常需要先找到索引,再使用 .splice()
删除元素:
Python 的.remove()
方法更直接:
JavaScript 的.pop()
只能删除最后一个元素,.splice()
可以删除任意位置:
Python 的.pop()
方法更灵活,可以删除任意位置:
del 语句
JavaScript 虽然有delete
操作符,但在数组中使用会产生"空洞",通常不推荐:
Python 的del
关键字会真正删除元素,后面的元素会前移:
clear 清空
删除方法总结
Python 提供了多种删除列表元素的方法,每种方法适用于不同的场景:
方法 | 语法 | 功能 | 返回值 | 使用场景 |
---|---|---|---|---|
remove(item) | lst.remove("apple") | 删除第一个匹配的值 | None | 知道要删除的值,不知道位置 |
pop() | lst.pop() | 删除最后一个元素 | 被删除的元素 | 需要删除并使用最后一个元素 |
pop(index) | lst.pop(0) | 删除指定位置的元素 | 被删除的元素 | 知道位置,需要删除并使用该元素 |
del lst[index] | del lst[0] | 删除指定位置的元素 | None | 知道位置,只删除不需要返回值 |
del lst[start:end] | del lst[1:3] | 删除指定范围的元素 | None | 删除连续的多个元素 |
clear() | lst.clear() | 删除所有元素 | None | 清空整个列表 |
排序
原地排序
JavaScript 使用.sort()
方法进行排序,支持自定义比较函数:
Python 的.sort()
方法默认就能正确处理数字和字符串:
返回新排序列表
如果想保持原列表不变,创建一个新的排序列表,可以使用 sorted()
函数:
自定义排序
JavaScript 使用比较函数来控制排序逻辑:
Python 使用 key
参数进行自定义排序,key
指定一个函数,用来从每个元素中提取比较的关键值:
反转列表
Python 提供了两种反转列表的方法:.reverse()
方法会直接修改原列表,而切片 [::-1]
会创建新列表。
复制
浅拷贝
JavaScript 中可以使用展开语法或.slice()
:
Python 提供多种浅拷贝方式:
深拷贝
对于包含嵌套列表的情况,需要深拷贝。
JavaScript 的深拷贝:
不过JSON.stringify
有一些限制:无法处理函数、undefined
、Symbol
、Date
对象等。对于复杂情况,可以使用structuredClone()
或第三方库。
Python 可以直接使用 copy
模块的 deepcopy()
函数:
zip 函数
JavaScript 中组合多个数组通常需要手动处理:
Python 的 zip()
函数可以直接处理这些操作:
多个列表组合
zip()
可以同时处理任意数量的列表:
矩阵转置
zip()
的一个经典用法是矩阵转置:
处理不同长度的列表
当列表长度不同时,zip()
以最短的为准:
解包
JavaScript 中有数组解构赋值:
Python 的列表解包功能类似,但语法更简洁:
扩展解包
Python 支持使用星号(*)进行扩展解包:
嵌套列表解包
对于嵌套的列表结构,也可以进行解包:
列表推导式
JavaScript 中处理数组时,我们经常需要使用.map()
、.filter()
等方法来变换和过滤数据:
推导式语法详解
Python 提供了 列表推导式(List Comprehension) 这一独特特性,它是一种简洁的语法,可以在一行代码中创建新列表。
推导式的完整语法结构是:[表达式 for 变量 in 可迭代对象 if 条件]
,各部分说明:
- 表达式:对每个元素进行的操作或变换
- for 变量 in 可迭代对象:遍历数据源
- if 条件:过滤条件(可选)
嵌套推导式
推导式还可以处理嵌套数据结构:
列表操作一览
列表方法
方法 | 功能 | 示例 | 返回值 |
---|---|---|---|
append(item) | 在末尾添加一个元素 | lst.append('new') | None |
extend(iterable) | 在末尾添加多个元素 | lst.extend([1, 2, 3]) | None |
insert(index, item) | 在指定位置插入元素 | lst.insert(0, 'first') | None |
remove(item) | 删除第一个匹配的元素 | lst.remove('apple') | None |
pop(index) | 删除并返回指定位置元素 | lst.pop() 或 lst.pop(0) | 被删除的元素 |
clear() | 清空所有元素 | lst.clear() | None |
index(item) | 返回元素首次出现的索引 | lst.index('apple') | 索引值 |
count(item) | 统计元素出现次数 | lst.count('apple') | 出现次数 |
sort() | 原地排序 | lst.sort() 或 lst.sort(reverse=True) | None |
reverse() | 原地反转 | lst.reverse() | None |
copy() | 创建浅拷贝 | new_lst = lst.copy() | 新列表 |
内置函数
函数 | 功能 | 示例 | 返回值 |
---|---|---|---|
len(lst) | 获取列表长度 | len([1, 2, 3]) | 长度 |
max(lst) | 获取最大值 | max([1, 2, 3]) | 最大值 |
min(lst) | 获取最小值 | min([1, 2, 3]) | 最小值 |
sum(lst) | 计算数值列表的和 | sum([1, 2, 3]) | 总和 |
sorted(lst) | 返回排序后的新列表 | sorted([3, 1, 2]) | 新的排序列表 |
reversed(lst) | 返回反转的迭代器 | list(reversed([1, 2, 3])) | 反转的迭代器 |
zip(lst1, lst2) | 组合多个列表 | list(zip([1, 2], ['a', 'b'])) | 组合后的迭代器 |
运算符和关键字
操作 | 功能 | 示例 | 返回值 |
---|---|---|---|
+ | 连接列表 | [1, 2] + [3, 4] | 新列表 |
* | 重复列表 | [1, 2] * 3 | 新列表 |
in | 检查元素是否存在 | 'apple' in fruits | 布尔值 |
not in | 检查元素是否不存在 | 'apple' not in fruits | 布尔值 |
== | 比较列表内容 | [1, 2] == [1, 2] | 布尔值 |
< , > , <= , >= | 按字典序比较 | [1, 2] < [1, 3] | 布尔值 |
del | 删除元素或切片 | del lst[0] 或 del lst[1:3] | None |
切片操作
操作 | 功能 | 示例 | 返回值 |
---|---|---|---|
lst[start:end] | 切片 | lst[1:3] | 新列表 |
lst[start:end:step] | 带步长切片 | lst[::2] | 新列表 |
lst[::-1] | 反转列表 | lst[::-1] | 新列表 |
小结
Python 列表是一个功能强大且灵活的数据结构:
- 语法相似:与 JavaScript 数组语法高度相似,学习成本低
- 负索引:支持从末尾访问元素,比 JavaScript 的
array.length-1
更简洁 - 切片功能:提供强大的切片操作,支持步长和负索引
- 丰富的方法:
append()
、extend()
、insert()
、remove()
、pop()
等方法覆盖各种操作需求 - 列表推导式:提供比 JavaScript
.map()
和.filter()
更简洁的语法 - 多种排序:
sort()
原地排序,sorted()
返回新列表,都支持自定义排序规则 - 灵活复制:多种浅拷贝方式,配合
copy
模块支持深拷贝 - 内置函数支持:
len()
、sum()
、max()
、min()
等函数都支持列表操作 - 类型转换:可以与字符串、其他数据类型方便地相互转换
掌握列表操作是 Python 编程的基础,它不仅是数据存储的重要工具,也是实现复杂算法和数据处理的基石。列表推导式等 Python 特有功能更是提高代码简洁性和可读性的重要工具。
练习
某班有 6 名学生的考试成绩数据,请完成以下学生成绩管理任务: