Skip to content

列表

24160字,阅读约151分钟

在 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有一些限制:无法处理函数、undefinedSymbolDate对象等。对于复杂情况,可以使用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 列表是一个功能强大且灵活的数据结构:

  1. 语法相似:与 JavaScript 数组语法高度相似,学习成本低
  2. 负索引:支持从末尾访问元素,比 JavaScript 的array.length-1更简洁
  3. 切片功能:提供强大的切片操作,支持步长和负索引
  4. 丰富的方法append()extend()insert()remove()pop() 等方法覆盖各种操作需求
  5. 列表推导式:提供比 JavaScript.map().filter()更简洁的语法
  6. 多种排序sort()原地排序,sorted()返回新列表,都支持自定义排序规则
  7. 灵活复制:多种浅拷贝方式,配合copy模块支持深拷贝
  8. 内置函数支持len()sum()max()min()等函数都支持列表操作
  9. 类型转换:可以与字符串、其他数据类型方便地相互转换

掌握列表操作是 Python 编程的基础,它不仅是数据存储的重要工具,也是实现复杂算法和数据处理的基石。列表推导式等 Python 特有功能更是提高代码简洁性和可读性的重要工具。

练习

某班有 6 名学生的考试成绩数据,请完成以下学生成绩管理任务:

点击查看参考答案

基于 MIT 许可发布