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.choice
或random.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 列表在语法上更简洁,切片操作更强大,但在高阶函数方面稍显不足。
如果您有具体的使用场景(例如列表排序、过滤或与随机数的复杂操作),可以进一步提问,我会提供更详细的示例!