Python 列表(List)

在 Python 中,列表(List) 是一种内置的数据结构,用于存储有序、可变、可重复的元素集合。列表是 Python 中最常用的数据类型之一,功能强大且灵活,类似于其他语言中的数组(如 JavaScript 的 Array)。以下是对 Python 列表的详细中文讲解:


1. 列表概述

  • 定义:列表是一个有序的、可变的元素集合,元素可以是任意类型(数字、字符串、对象、甚至其他列表等)。
  • 特点
  • 有序:元素按照插入顺序存储,可通过索引访问。
  • 可变:可以随时修改、添加或删除元素。
  • 允许重复:同一个元素可以多次出现在列表中。
  • 动态长度:无需预定义大小,长度可动态变化。
  • 创建方式
  # 方法 1:字面量
  my_list = [1, 2, 3]

  # 方法 2:list() 构造函数
  my_list2 = list((1, 2, 3))

  # 方法 3:空列表
  empty_list = []

  # 方法 4:列表推导式
  squares = [x**2 for x in range(5)]  # [0, 1, 4, 9, 16]

2. 基本操作

以下是列表的常用操作:

(1) 访问元素

通过索引(从 0 开始)访问列表元素,支持负索引(从 -1 开始倒数):

fruits = ["苹果", "香蕉", "橙子"]
print(fruits[0])    # 输出: 苹果
print(fruits[-1])   # 输出: 橙子
print(len(fruits))  # 输出: 3(列表长度)

(2) 切片(Slicing)

通过切片提取子列表,格式为 [start:end:step]

numbers = [0, 1, 2, 3, 4]
print(numbers[1:4])    # 输出: [1, 2, 3](从索引 1 到 3)
print(numbers[::2])    # 输出: [0, 2, 4](每隔一个元素)
print(numbers[::-1])   # 输出: [4, 3, 2, 1, 0](逆序)

(3) 修改元素

通过索引直接修改:

fruits[1] = "芒果"
print(fruits)  # 输出: ['苹果', '芒果', '橙子']

(4) 添加/删除元素

  • 添加
  • append(item):在列表末尾添加单个元素。
  • extend(iterable)+=:添加可迭代对象的所有元素。
  • insert(index, item):在指定索引插入元素。
  my_list = [1, 2]
  my_list.append(3)         # [1, 2, 3]
  my_list.extend([4, 5])    # [1, 2, 3, 4, 5]
  my_list.insert(1, "a")    # [1, 'a', 2, 3, 4, 5]
  print(my_list)
  • 删除
  • pop([index]):删除并返回指定索引(默认最后一个)的元素。
  • remove(item):删除第一个匹配的元素。
  • clear():清空列表。
  • del 语句:删除指定索引或切片的元素。
  my_list = [1, 2, 3, 2]
  my_list.pop()         # 返回 2,列表变为 [1, 2, 3]
  my_list.remove(2)     # 删除第一个 2,列表变为 [1, 3]
  del my_list[0]        # 删除索引 0,列表变为 [3]
  my_list.clear()       # 清空,列表变为 []
  print(my_list)

3. 常用列表方法

Python 列表提供了许多内置方法,便于操作和处理数据:

  • append(item):在列表末尾添加元素。
  lst = [1, 2]
  lst.append(3)  # [1, 2, 3]
  • extend(iterable):扩展列表,添加可迭代对象的所有元素。
  lst.extend([4, 5])  # [1, 2, 3, 4, 5]
  • insert(index, item):在指定索引插入元素。
  lst.insert(1, "x")  # [1, "x", 2, 3, 4, 5]
  • remove(item):删除第一个匹配的元素,若不存在则抛出 ValueError。
  lst.remove("x")  # [1, 2, 3, 4, 5]
  • pop([index]):删除并返回指定索引的元素,默认最后一个。
  item = lst.pop()  # 返回 5,列表变为 [1, 2, 3, 4]
  • clear():清空列表。
  lst.clear()  # []
  • index(item[, start[, end]]):返回元素首次出现的索引,未找到抛出 ValueError。
  lst = [1, 2, 3, 2]
  print(lst.index(2))  # 输出: 1
  • count(item):返回元素在列表中出现的次数。
  print(lst.count(2))  # 输出: 2
  • sort(key=None, reverse=False):对列表进行原地排序。
  lst = [3, 1, 2]
  lst.sort()           # [1, 2, 3]
  lst.sort(reverse=True)  # [3, 2, 1]
  • reverse():原地反转列表。
  lst.reverse()  # [1, 2, 3]
  • copy():返回列表的浅拷贝。
  new_list = lst.copy()  # [1, 2, 3]

4. 列表推导式

列表推导式是 Python 中创建和操作列表的简洁方式,类似于数学中的集合表示法:

# 基本格式:[表达式 for 变量 in 可迭代对象 if 条件]
squares = [x**2 for x in range(5)]  # [0, 1, 4, 9, 16]
evens = [x for x in range(10) if x % 2 == 0]  # [0, 2, 4, 6, 8]

嵌套推导式

matrix = [[1, 2], [3, 4]]
flattened = [num for row in matrix for num in row]  # [1, 2, 3, 4]

5. 与 random.random() 的结合

结合您之前询问的 random.random(),可以用它对列表进行随机操作:

  • 随机选择元素(使用 random.choicerandom.random):
  import random
  fruits = ["苹果", "香蕉", "橙子"]
  print(random.choice(fruits))  # 随机输出一个水果
  • 随机打乱列表(使用 random.shuffle):
  random.shuffle(fruits)  # 原地打乱列表
  print(fruits)  # 例如: ['橙子', '苹果', '香蕉']
  • 生成随机列表
  random_list = [random.random() for _ in range(5)]  # 生成 5 个随机浮点数
  print(random_list)  # 例如: [0.123, 0.456, 0.789, 0.234, 0.567]

6. 与 JavaScript Array 的比较

结合您之前询问的 JavaScript Array,这里简单对比:

  • 相似点
  • 两者都是有序、可变的集合,支持索引访问、添加、删除等操作。
  • 都有类似的方法,如 Python 的 append 对应 JS 的 push,Python 的 pop 类似 JS 的 pop
  • 都支持切片(Python 用 [:],JS 用 slice())。
  • 不同点
  • 类型灵活性:Python 列表和 JS 数组都允许混合类型,但 JS 数组是对象,Python 列表是独立的序列类型。
  • 方法丰富度:JS 提供更多高阶函数(如 map, filter, reduce),Python 更依赖列表推导式或 map()/filter() 函数。
  • 稀疏性:JS 数组支持稀疏数组(空位),Python 列表不支持,空位会存储 None
  • 性能:Python 列表在某些操作(如切片)上更高效,JS 数组在高阶函数上更简洁。

7. 注意事项

  • 可变性:列表是可变的,修改会影响原列表。需要复制时,使用 copy()list() 避免影响原数据:
  lst = [1, 2, 3]
  new_lst = lst.copy()
  new_lst[0] = 10
  print(lst)      # [1, 2, 3](原列表不变)
  print(new_lst)  # [10, 2, 3]
  • 嵌套列表:列表可以嵌套,但嵌套列表的修改需要注意浅拷贝问题:
  matrix = [[1, 2], [3, 4]]
  copy_matrix = matrix.copy()  # 浅拷贝
  copy_matrix[0][0] = 10
  print(matrix)  # [[10, 2], [3, 4]](原列表被修改)

解决方法:使用 copy.deepcopy

  import copy
  deep_copy = copy.deepcopy(matrix)
  • 性能:列表适合中小型数据操作,大规模数据可能需要考虑 numpy 数组以提高效率。

8. 总结

Python 列表是灵活且强大的数据结构,支持多种操作和方法,适合存储和处理有序数据。结合列表推导式和 random 模块,可以实现高效的随机操作和数据处理。相比 JavaScript 的 Array,Python 列表在语法上更简洁,切片操作更强大,但在高阶函数方面稍显不足。

如果您有具体的使用场景(例如列表排序、过滤或与随机数的复杂操作),可以进一步提问,我会提供更详细的示例!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注