Python列表详解
列表是Python中最常用的数据结构之一,用于存储有序的元素集合。Python提供了丰富的列表操作方法和功能。本文将详细介绍Python列表的特性、操作和最佳实践。
一、列表概述
1. 什么是列表?
列表(List)是Python中的一种有序、可变的序列类型,用于存储任意类型的元素。列表中的元素可以是数字、字符串、布尔值、None、甚至是其他列表(嵌套列表)。
2. 列表的特点
- 有序性:列表中的元素有固定的顺序,可以通过索引访问
- 可变性:列表创建后可以修改其内容(添加、删除、修改元素)
- 可迭代性:可以使用循环遍历列表中的每个元素
- 可容纳任意类型:可以存储不同类型的元素
- 可嵌套:列表中可以包含其他列表
3. 列表的表示
列表使用方括号[]表示,元素之间用逗号,分隔:
# 列表示例
numbers = [1, 2, 3, 4, 5]
fruits = ["apple", "banana", "orange"]
mixed = [1, "apple", True, None, [1, 2, 3]]
二、列表的创建
1. 基本创建方法
# 使用方括号创建空列表
empty_list = []
# 创建包含元素的列表
numbers = [1, 2, 3, 4, 5]
strings = ["hello", "world"]
mixed = [1, "hello", True]
# 创建嵌套列表
nested = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
2. 使用list()函数创建
# 创建空列表
empty_list = list()
# 将可迭代对象转换为列表
from_string = list("hello") # ['h', 'e', 'l', 'l', 'o']
from_tuple = list((1, 2, 3)) # [1, 2, 3]
from_set = list({1, 2, 3}) # [1, 2, 3](集合是无序的,所以顺序可能不同)
from_range = list(range(10)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3. 使用列表推导式创建
列表推导式是一种简洁创建列表的方法(详见第七部分):
# 列表推导式示例
squares = [x ** 2 for x in range(1, 6)] # [1, 4, 9, 16, 25]
evens = [x for x in range(10) if x % 2 == 0] # [0, 2, 4, 6, 8]
三、列表的基本操作
1. 访问列表元素
可以通过索引访问列表中的元素:
# 访问列表元素示例
fruits = ["apple", "banana", "orange", "grape"]
# 正索引(从0开始)
print(fruits[0]) # apple
print(fruits[1]) # banana
# 负索引(从末尾开始,-1表示最后一个元素)
print(fruits[-1]) # grape
print(fruits[-2]) # orange
# 超出范围的索引会报错
try:
print(fruits[10])
except IndexError as e:
print(f"错误:{e}") # 错误:list index out of range
2. 修改列表元素
可以通过索引修改列表中的元素:
# 修改列表元素示例
numbers = [1, 2, 3, 4, 5]
numbers[0] = 10
print(numbers) # [10, 2, 3, 4, 5]
numbers[-1] = 50
print(numbers) # [10, 2, 3, 4, 50]
# 修改嵌套列表中的元素
nested = [[1, 2, 3], [4, 5, 6]]
nested[0][1] = 20
print(nested) # [[1, 20, 3], [4, 5, 6]]
3. 列表切片
切片用于获取列表的子列表,语法为list[start:end:step]:
# 列表切片示例
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 基本切片
print(numbers[0:5]) # [0, 1, 2, 3, 4](索引0到5,不包含5)
print(numbers[5:]) # [5, 6, 7, 8, 9](索引5到末尾)
print(numbers[:5]) # [0, 1, 2, 3, 4](从开头到索引5,不包含5)
# 使用负索引切片
print(numbers[-5:]) # [5, 6, 7, 8, 9](从倒数第5个元素到末尾)
print(numbers[:-5]) # [0, 1, 2, 3, 4](从开头到倒数第5个元素,不包含)
# 使用步长
print(numbers[0:10:2]) # [0, 2, 4, 6, 8](每2个元素取一个)
print(numbers[::2]) # [0, 2, 4, 6, 8](从开头到末尾,每2个元素取一个)
print(numbers[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0](反转列表)
# 所有元素
print(numbers[:]) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9](整个列表)
# 切片赋值
numbers[0:3] = [10, 20, 30]
print(numbers) # [10, 20, 30, 3, 4, 5, 6, 7, 8, 9]
# 删除切片
numbers[3:6] = []
print(numbers) # [10, 20, 30, 6, 7, 8, 9]
# 插入切片
numbers[3:3] = [40, 50]
print(numbers) # [10, 20, 30, 40, 50, 6, 7, 8, 9]
4. 列表长度
可以使用len()函数获取列表的长度:
# 列表长度示例
numbers = [1, 2, 3, 4, 5]
print(len(numbers)) # 5
empty_list = []
print(len(empty_list)) # 0
nested = [[1, 2, 3], [4, 5, 6]]
print(len(nested)) # 2(嵌套列表的长度是外层列表的元素个数)
5. 列表拼接
可以使用+运算符拼接列表:
# 列表拼接示例
list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined = list1 + list2
print(combined) # [1, 2, 3, 4, 5, 6]
# 使用+=运算符
list1 += list2
print(list1) # [1, 2, 3, 4, 5, 6]
6. 列表重复
可以使用*运算符重复列表:
# 列表重复示例
numbers = [1, 2, 3]
print(numbers * 3) # [1, 2, 3, 1, 2, 3, 1, 2, 3]
# 使用*=运算符
numbers *= 2
print(numbers) # [1, 2, 3, 1, 2, 3]
7. 成员检查
可以使用in和not in运算符检查元素是否在列表中:
# 成员检查示例
fruits = ["apple", "banana", "orange"]
print("apple" in fruits) # True
print("grape" not in fruits) # True
# 检查嵌套列表中的元素
nested = [[1, 2], [3, 4]]
print([1, 2] in nested) # True
print(1 in nested) # False(检查的是外层列表的元素)
四、列表的常用方法
Python列表提供了丰富的方法用于操作列表:
1. 添加元素
# 添加元素方法示例
numbers = [1, 2, 3]
# append():在列表末尾添加一个元素
numbers.append(4)
print(numbers) # [1, 2, 3, 4]
# extend():在列表末尾添加另一个可迭代对象的所有元素
numbers.extend([5, 6, 7])
print(numbers) # [1, 2, 3, 4, 5, 6, 7]
# 使用+运算符也可以实现类似效果,但会创建新列表
numbers = numbers + [8, 9]
print(numbers) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
# insert():在指定位置插入一个元素
numbers.insert(0, 0) # 在索引0处插入0
print(numbers) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
numbers.insert(3, 2.5) # 在索引3处插入2.5
print(numbers) # [0, 1, 2, 2.5, 3, 4, 5, 6, 7, 8, 9]
2. 删除元素
# 删除元素方法示例
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# remove():删除第一个匹配的元素
numbers.remove(2)
print(numbers) # [0, 1, 3, 4, 5, 6, 7, 8, 9]
# 如果元素不存在会报错
try:
numbers.remove(10)
except ValueError as e:
print(f"错误:{e}") # 错误:list.remove(x): x not in list
# pop():删除并返回指定位置的元素(默认最后一个元素)
last = numbers.pop()
print(last, numbers) # 9 [0, 1, 3, 4, 5, 6, 7, 8]
first = numbers.pop(0)
print(first, numbers) # 0 [1, 3, 4, 5, 6, 7, 8]
# del语句:删除指定位置的元素或整个列表
del numbers[1] # 删除索引1处的元素
print(numbers) # [1, 4, 5, 6, 7, 8]
del numbers[2:4] # 删除索引2到4的元素(不包含4)
print(numbers) # [1, 4, 7, 8]
del numbers # 删除整个列表
try:
print(numbers)
except NameError as e:
print(f"错误:{e}") # 错误:name 'numbers' is not defined
3. 排序和反转
# 排序和反转方法示例
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5]
# sort():对列表进行排序(默认升序)
numbers.sort()
print(numbers) # [1, 1, 2, 3, 4, 5, 5, 6, 9]
# 降序排序
numbers.sort(reverse=True)
print(numbers) # [9, 6, 5, 5, 4, 3, 2, 1, 1]
# 自定义排序(如按照绝对值大小)
numbers = [-3, 1, -4, 1, -5, 9]
numbers.sort(key=abs)
print(numbers) # [1, 1, -3, -4, 9, -5]
# reverse():反转列表
numbers = [1, 2, 3, 4, 5]
numbers.reverse()
print(numbers) # [5, 4, 3, 2, 1]
# 使用切片也可以实现反转
numbers = [1, 2, 3, 4, 5]
reversed_numbers = numbers[::-1]
print(reversed_numbers) # [5, 4, 3, 2, 1]
print(numbers) # [1, 2, 3, 4, 5](原列表不变)
4. 查找和计数
# 查找和计数方法示例
numbers = [1, 2, 3, 2, 4, 2, 5]
# index():返回第一个匹配元素的索引
print(numbers.index(2)) # 1
# 指定查找范围
print(numbers.index(2, 2)) # 3(从索引2开始查找)
# 如果元素不存在会报错
try:
print(numbers.index(10))
except ValueError as e:
print(f"错误:{e}") # 错误:10 is not in list
# count():统计元素出现的次数
print(numbers.count(2)) # 3
print(numbers.count(10)) # 0(元素不存在,返回0)
5. 其他常用方法
# 其他常用方法示例
fruits = ["apple", "banana", "orange"]
# copy():复制列表
fruits_copy = fruits.copy()
print(fruits_copy) # ["apple", "banana", "orange"]
# clear():清空列表
fruits.clear()
print(fruits) # []
# 检查列表是否为空
if not fruits:
print("列表为空")
# max():返回列表中的最大值(元素必须可比较)
numbers = [1, 2, 3, 4, 5]
print(max(numbers)) # 5
# min():返回列表中的最小值(元素必须可比较)
print(min(numbers)) # 1
# sum():返回列表中所有元素的和(元素必须是数字)
print(sum(numbers)) # 15
五、列表推导式
列表推导式(List Comprehension)是一种简洁创建列表的方法,语法为[expression for item in iterable if condition]:
1. 基本列表推导式
# 基本列表推导式示例
# 创建1-10的平方列表
squares = [x ** 2 for x in range(1, 11)]
print(squares) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# 创建1-10的偶数列表
evens = [x for x in range(1, 11) if x % 2 == 0]
print(evens) # [2, 4, 6, 8, 10]
# 创建1-10的奇数列表
odds = [x for x in range(1, 11) if x % 2 != 0]
print(odds) # [1, 3, 5, 7, 9]
2. 嵌套列表推导式
# 嵌套列表推导式示例
# 创建一个3x3的二维列表
matrix = [[i for i in range(3)] for _ in range(3)]
print(matrix) # [[0, 1, 2], [0, 1, 2], [0, 1, 2]]
# 创建一个3x3的单位矩阵
identity = [[1 if i == j else 0 for j in range(3)] for i in range(3)]
print(identity) # [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
# 展平二维列表
nested = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for sublist in nested for num in sublist]
print(flattened) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 过滤嵌套列表中的元素
even_flattened = [num for sublist in nested for num in sublist if num % 2 == 0]
print(even_flattened) # [2, 4, 6, 8]
3. 带有条件的列表推导式
# 带有条件的列表推导式示例
# 三元表达式
numbers = [1, 2, 3, 4, 5]
result = ["even" if x % 2 == 0 else "odd" for x in numbers]
print(result) # ['odd', 'even', 'odd', 'even', 'odd']
# 多个条件
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = [x for x in numbers if x % 2 == 0 and x > 5]
print(result) # [6, 8, 10]
# 嵌套条件
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = ["small even" if x < 5 and x % 2 == 0 else "small odd" if x < 5 and x % 2 != 0 else "large even" if x % 2 == 0 else "large odd" for x in numbers]
print(result) # ['small odd', 'small even', 'small odd', 'small even', 'large odd', 'large even', 'large odd', 'large even', 'large odd', 'large even']
六、嵌套列表
嵌套列表是指列表中包含其他列表,用于表示二维或多维数据结构:
1. 创建嵌套列表
# 创建嵌套列表示例
# 二维列表(矩阵)
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 三维列表
cube = [
[
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
],
[
[10, 11, 12],
[13, 14, 15],
[16, 17, 18]
]
]
2. 访问嵌套列表元素
# 访问嵌套列表元素示例
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 访问第0行第0列的元素
print(matrix[0][0]) # 1
# 访问第1行第2列的元素
print(matrix[1][2]) # 6
# 访问第2行所有元素
print(matrix[2]) # [7, 8, 9]
# 访问所有行的第1列元素
column1 = [row[1] for row in matrix]
print(column1) # [2, 5, 8]
3. 修改嵌套列表元素
# 修改嵌套列表元素示例
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 修改第0行第0列的元素
matrix[0][0] = 10
print(matrix) # [[10, 2, 3], [4, 5, 6], [7, 8, 9]]
# 修改第1行所有元素
matrix[1] = [11, 12, 13]
print(matrix) # [[10, 2, 3], [11, 12, 13], [7, 8, 9]]
# 修改所有行的第2列元素
for row in matrix:
row[2] = row[2] * 2
print(matrix) # [[10, 2, 6], [11, 12, 26], [7, 8, 18]]
4. 遍历嵌套列表
# 遍历嵌套列表示例
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 遍历所有元素
for row in matrix:
for num in row:
print(num, end=" ")
print()
# 输出:
# 1 2 3
# 4 5 6
# 7 8 9
# 使用列表推导式遍历
all_elements = [num for row in matrix for num in row]
print(all_elements) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
七、列表的高级操作
1. 列表的复制
列表的复制有几种方法,需要注意浅拷贝和深拷贝的区别:
# 列表复制示例
original = [1, 2, [3, 4]]
# 方法1:使用copy()方法(浅拷贝)
copy1 = original.copy()
# 方法2:使用切片(浅拷贝)
copy2 = original[:]
# 方法3:使用list()函数(浅拷贝)
copy3 = list(original)
# 修改原列表中的不可变元素
original[0] = 10
print(original) # [10, 2, [3, 4]]
print(copy1) # [1, 2, [3, 4]](副本不受影响)
# 修改原列表中的可变元素(浅拷贝的问题)
original[2][0] = 30
print(original) # [10, 2, [30, 4]]
print(copy1) # [1, 2, [30, 4]](副本也被修改了)
# 深拷贝(需要使用copy模块)
import copy
deep_copy = copy.deepcopy(original)
original[2][1] = 40
print(original) # [10, 2, [30, 40]]
print(deep_copy) # [10, 2, [30, 4]](深拷贝不受影响)
2. 列表的排序算法
Python的sort()方法使用Timsort算法,这是一种高效的混合排序算法,结合了归并排序和插入排序的优点:
# 列表排序算法示例
# 使用key参数自定义排序
words = ["apple", "banana", "cherry", "date"]
# 按照长度排序
words.sort(key=len)
print(words) # ['date', 'apple', 'banana', 'cherry']
# 按照字母顺序的相反顺序排序
words.sort(key=str.lower, reverse=True)
print(words) # ['cherry', 'banana', 'date', 'apple']
# 使用lambda函数作为key
students = [
{"name": "张三", "age": 20},
{"name": "李四", "age": 18},
{"name": "王五", "age": 22}
]
# 按照年龄排序
students.sort(key=lambda student: student["age"])
print(students) # [{'name': '李四', 'age': 18}, {'name': '张三', 'age': 20}, {'name': '王五', 'age': 22}]
3. 列表的迭代器和生成器
# 列表的迭代器和生成器示例
# 使用iter()函数创建迭代器
numbers = [1, 2, 3, 4, 5]
iterator = iter(numbers)
print(next(iterator)) # 1
print(next(iterator)) # 2
print(next(iterator)) # 3
# 使用for循环自动使用迭代器
for num in numbers:
print(num)
# 生成器表达式(比列表推导式更节省内存)
squares_generator = (x ** 2 for x in range(1, 11))
for square in squares_generator:
print(square)
# 将生成器转换为列表
print(list(squares_generator)) # [](生成器只能遍历一次)
八、列表的性能分析
1. 常见操作的时间复杂度
| 操作 | 时间复杂度 | 描述 |
|---|---|---|
| 索引访问 | O(1) | 直接访问列表中的元素 |
| 索引修改 | O(1) | 修改列表中指定位置的元素 |
| 列表长度 | O(1) | len()函数返回列表的长度 |
| 追加元素 | O(1) | append()方法在列表末尾添加元素 |
| 插入元素 | O(n) | insert()方法在指定位置插入元素 |
| 删除元素 | O(n) | remove()、pop()方法删除元素 |
| 切片操作 | O(k) | 获取长度为k的子列表 |
| 列表拼接 | O(k) | +运算符拼接长度为k的列表 |
| 成员检查 | O(n) | in运算符检查元素是否在列表中 |
| 排序 | O(n log n) | sort()方法对列表进行排序 |
2. 性能优化建议
- 尽量使用
append()而不是+运算符进行列表扩展(append()是O(1),+是O(k)) - 尽量使用列表推导式而不是循环和
append()(列表推导式更快) - 避免频繁在列表开头插入或删除元素(O(n)操作)
- 如果需要频繁在两端操作,考虑使用
collections.deque(双端队列,两端操作都是O(1))
九、列表的最佳实践
1. 列表创建
- 对于简单列表,使用方括号直接创建
- 对于复杂列表,使用列表推导式
- 避免创建不必要的列表副本
# 好的写法
numbers = [1, 2, 3, 4, 5]
squares = [x ** 2 for x in numbers]
# 不好的写法
numbers = []
for i in range(1, 6):
numbers.append(i)
squares = []
for x in numbers:
squares.append(x ** 2)
2. 列表操作
- 优先使用列表方法而不是手动实现
- 避免频繁修改列表开头
- 使用切片进行批量操作
# 好的写法
numbers = [1, 2, 3, 4, 5]
numbers.extend([6, 7, 8])
# 不好的写法
for i in [6, 7, 8]:
numbers.append(i)
3. 列表遍历
- 使用for循环直接遍历列表元素
- 避免使用索引遍历列表
# 好的写法
fruits = ["apple", "banana", "orange"]
for fruit in fruits:
print(fruit)
# 不好的写法
for i in range(len(fruits)):
print(fruits[i])
4. 列表排序
- 使用
sort()方法对列表进行原地排序 - 使用
sorted()函数获取排序后的新列表 - 利用
key参数进行自定义排序
# 好的写法
numbers = [3, 1, 4, 1, 5, 9]
numbers.sort() # 原地排序
# 获取排序后的新列表
sorted_numbers = sorted(numbers)
# 不好的写法
for i in range(len(numbers)):
for j in range(i+1, len(numbers)):
if numbers[i] > numbers[j]:
numbers[i], numbers[j] = numbers[j], numbers[i]
十、总结
Python列表是一种强大、灵活的数据结构,具有以下特点:
- 有序性和可变性:列表中的元素有固定顺序,可以修改
- 丰富的操作:支持访问、修改、添加、删除、切片等操作
- 强大的方法:提供了大量用于操作列表的方法
- 列表推导式:简洁高效地创建列表
- 嵌套列表:支持二维和多维数据结构
- 可迭代性:可以使用循环遍历
通过掌握Python列表的特性和操作方法,可以高效地处理各种数据集合,编写简洁、优雅的代码。
发布网站:荣殿教程(zhangrongdian.com)
作者:张荣殿