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]]
Copy
二、列表的创建
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]]
Copy
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]
Copy
3. 使用列表推导式创建
列表推导式是一种简洁创建列表的方法(详见第七部分):
# 列表推导式示例squares =[x **2for x inrange(1,6)]# [1, 4, 9, 16, 25]evens =[x for x inrange(10)if x %2==0]# [0, 2, 4, 6, 8]
Copy
三、列表的基本操作
1. 访问列表元素
可以通过索引访问列表中的元素:
# 访问列表元素示例fruits =["apple","banana","orange","grape"]# 正索引(从0开始)print(fruits[0])# appleprint(fruits[1])# banana# 负索引(从末尾开始,-1表示最后一个元素)print(fruits[-1])# grapeprint(fruits[-2])# orange# 超出范围的索引会报错try:print(fruits[10])except IndexError as e:print(f"错误:{e}")# 错误:list index out of range
Copy
2. 修改列表元素
可以通过索引修改列表中的元素:
# 修改列表元素示例numbers =[1,2,3,4,5]numbers[0]=10print(numbers)# [10, 2, 3, 4, 5]numbers[-1]=50print(numbers)# [10, 2, 3, 4, 50]# 修改嵌套列表中的元素nested =[[1,2,3],[4,5,6]]nested[0][1]=20print(nested)# [[1, 20, 3], [4, 5, 6]]
Copy
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]
Copy
4. 列表长度
可以使用len()函数获取列表的长度:
# 列表长度示例numbers =[1,2,3,4,5]print(len(numbers))# 5empty_list =[]print(len(empty_list))# 0nested =[[1,2,3],[4,5,6]]print(len(nested))# 2(嵌套列表的长度是外层列表的元素个数)
Copy
5. 列表拼接
可以使用+运算符拼接列表:
# 列表拼接示例list1 =[1,2,3]list2 =[4,5,6]combined = list1 + list2print(combined)# [1, 2, 3, 4, 5, 6]# 使用+=运算符list1 += list2print(list1)# [1, 2, 3, 4, 5, 6]
Copy
6. 列表重复
可以使用*运算符重复列表:
# 列表重复示例numbers =[1,2,3]print(numbers *3)# [1, 2, 3, 1, 2, 3, 1, 2, 3]# 使用*=运算符numbers *=2print(numbers)# [1, 2, 3, 1, 2, 3]
Copy
7. 成员检查
可以使用in和not in运算符检查元素是否在列表中:
# 成员检查示例fruits =["apple","banana","orange"]print("apple"in fruits)# Trueprint("grape"notin fruits)# True# 检查嵌套列表中的元素nested =[[1,2],[3,4]]print([1,2]in nested)# Trueprint(1in nested)# False(检查的是外层列表的元素)
Copy
四、列表的常用方法
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处插入0print(numbers)# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]numbers.insert(3,2.5)# 在索引3处插入2.5print(numbers)# [0, 1, 2, 2.5, 3, 4, 5, 6, 7, 8, 9]
Copy
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
Copy
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](原列表不变)
Copy
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))# 3print(numbers.count(10))# 0(元素不存在,返回0)
Copy
5. 其他常用方法
# 其他常用方法示例fruits =["apple","banana","orange"]# copy():复制列表fruits_copy = fruits.copy()print(fruits_copy)# ["apple", "banana", "orange"]# clear():清空列表fruits.clear()print(fruits)# []# 检查列表是否为空ifnot fruits:print("列表为空")# max():返回列表中的最大值(元素必须可比较)numbers =[1,2,3,4,5]print(max(numbers))# 5# min():返回列表中的最小值(元素必须可比较)print(min(numbers))# 1# sum():返回列表中所有元素的和(元素必须是数字)print(sum(numbers))# 15
Copy
五、列表推导式
列表推导式(List Comprehension)是一种简洁创建列表的方法,语法为[expression for item in iterable if condition]:
1. 基本列表推导式
# 基本列表推导式示例# 创建1-10的平方列表squares =[x **2for x inrange(1,11)]print(squares)# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]# 创建1-10的偶数列表evens =[x for x inrange(1,11)if x %2==0]print(evens)# [2, 4, 6, 8, 10]# 创建1-10的奇数列表odds =[x for x inrange(1,11)if x %2!=0]print(odds)# [1, 3, 5, 7, 9]
Copy
2. 嵌套列表推导式
# 嵌套列表推导式示例# 创建一个3x3的二维列表matrix =[[i for i inrange(3)]for _ inrange(3)]print(matrix)# [[0, 1, 2], [0, 1, 2], [0, 1, 2]]# 创建一个3x3的单位矩阵identity =[[1if i == j else0for j inrange(3)]for i inrange(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]
Copy
3. 带有条件的列表推导式
# 带有条件的列表推导式示例# 三元表达式numbers =[1,2,3,4,5]result =["even"if x %2==0else"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==0and x >5]print(result)# [6, 8, 10]# 嵌套条件numbers =[1,2,3,4,5,6,7,8,9,10]result =["small even"if x <5and x %2==0else"small odd"if x <5and x %2!=0else"large even"if x %2==0else"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']
Copy
六、嵌套列表
嵌套列表是指列表中包含其他列表,用于表示二维或多维数据结构:
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]]]
Copy
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]
Copy
3. 修改嵌套列表元素
# 修改嵌套列表元素示例matrix =[[1,2,3],[4,5,6],[7,8,9]]# 修改第0行第0列的元素matrix[0][0]=10print(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]*2print(matrix)# [[10, 2, 6], [11, 12, 26], [7, 8, 18]]
Copy
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]
Copy
七、列表的高级操作
1. 列表的复制
列表的复制有几种方法,需要注意浅拷贝和深拷贝的区别:
# 列表复制示例original =[1,2,[3,4]]# 方法1:使用copy()方法(浅拷贝)copy1 = original.copy()# 方法2:使用切片(浅拷贝)copy2 = original[:]# 方法3:使用list()函数(浅拷贝)copy3 =list(original)# 修改原列表中的不可变元素original[0]=10print(original)# [10, 2, [3, 4]]print(copy1)# [1, 2, [3, 4]](副本不受影响)# 修改原列表中的可变元素(浅拷贝的问题)original[2][0]=30print(original)# [10, 2, [30, 4]]print(copy1)# [1, 2, [30, 4]](副本也被修改了)# 深拷贝(需要使用copy模块)import copydeep_copy = copy.deepcopy(original)original[2][1]=40print(original)# [10, 2, [30, 40]]print(deep_copy)# [10, 2, [30, 4]](深拷贝不受影响)
Copy
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函数作为keystudents =[{"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}]
Copy
3. 列表的迭代器和生成器
# 列表的迭代器和生成器示例# 使用iter()函数创建迭代器numbers =[1,2,3,4,5]iterator =iter(numbers)print(next(iterator))# 1print(next(iterator))# 2print(next(iterator))# 3# 使用for循环自动使用迭代器for num in numbers:print(num)# 生成器表达式(比列表推导式更节省内存)squares_generator =(x **2for x inrange(1,11))for square in squares_generator:print(square)# 将生成器转换为列表print(list(squares_generator))# [](生成器只能遍历一次)
Copy
八、列表的性能分析
1. 常见操作的时间复杂度
2. 性能优化建议
- 尽量使用
append()而不是+运算符进行列表扩展(append()是O(1),+是O(k)) - 尽量使用列表推导式而不是循环和
append()(列表推导式更快) - 如果需要频繁在两端操作,考虑使用
collections.deque(双端队列,两端操作都是O(1))
九、列表的最佳实践
1. 列表创建
# 好的写法numbers =[1,2,3,4,5]squares =[x **2for x in numbers]# 不好的写法numbers =[]for i inrange(1,6): numbers.append(i) squares =[]for x in numbers: squares.append(x **2)
Copy
2. 列表操作
# 好的写法numbers =[1,2,3,4,5]numbers.extend([6,7,8])# 不好的写法for i in[6,7,8]: numbers.append(i)
Copy
3. 列表遍历
# 好的写法fruits =["apple","banana","orange"]for fruit in fruits:print(fruit)# 不好的写法for i inrange(len(fruits)):print(fruits[i])
Copy
4. 列表排序
# 好的写法numbers =[3,1,4,1,5,9]numbers.sort()# 原地排序# 获取排序后的新列表sorted_numbers =sorted(numbers)# 不好的写法for i inrange(len(numbers)):for j inrange(i+1,len(numbers)):if numbers[i]> numbers[j]: numbers[i], numbers[j]= numbers[j], numbers[i]
Copy
十、总结
Python列表是一种强大、灵活的数据结构,具有以下特点:
- 有序性和可变性
- 丰富的操作
- 强大的方法
- 列表推导式
- 嵌套列表
- 可迭代性
通过掌握Python列表的特性和操作方法,可以高效地处理各种数据集合,编写简洁、优雅的代码。
发布网站:荣殿教程(zhangrongdian.com)
作者:张荣殿