Python3 列表(保姆级教程)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言
Python3 列表(List)是编程中最为常用的数据结构之一。它像一个灵活的“万能工具箱”,可以存储多种类型的数据,并支持高效的增删改查操作。无论是处理简单数据还是构建复杂算法,列表都是开发者不可或缺的工具。本文将从基础概念出发,逐步深入讲解 Python3 列表的核心特性、应用场景和优化技巧,帮助读者在实际开发中灵活运用这一数据结构。
列表基础:创建与基本操作
1. 列表的创建
列表用方括号 []
定义,元素之间用逗号分隔。例如:
empty_list = []
mixed_list = [1, "hello", 3.14, True]
比喻:可以将列表想象成一个书架,每个“书格”对应一个元素的位置。例如:["小说", "散文", "诗歌"]
就是一个包含三本书的书架。
2. 元素访问与索引
列表的索引从 0
开始,支持正向和负向索引:
books = ["小说", "散文", "诗歌"]
print(books[0]) # 输出:"小说"
print(books[-1]) # 输出:"诗歌"(最后一个元素)
常见操作示例:
print(books[2]) # 输出:"诗歌"
列表的增删改查:核心操作详解
1. 修改元素
通过索引可以直接修改列表中的元素:
numbers = [10, 20, 30]
numbers[1] = 25 # 将第二个元素改为25
print(numbers) # 输出:[10, 25, 30]
2. 添加元素
-
append()
:在列表末尾添加一个元素:fruits = ["apple", "banana"] fruits.append("orange") print(fruits) # 输出:["apple", "banana", "orange"]
-
insert()
:在指定位置插入元素:fruits.insert(1, "grape") print(fruits) # 输出:["apple", "grape", "banana", "orange"]
3. 删除元素
-
remove()
:按值删除第一个匹配的元素:fruits.remove("grape") print(fruits) # 输出:["apple", "banana", "orange"]
-
pop()
:按索引删除元素并返回其值:removed = fruits.pop(1) # 删除索引1的元素 print(removed) # 输出:"banana"
4. 列表切片
切片语法 [:]
可以提取子列表:
numbers = [0, 1, 2, 3, 4, 5]
sub_list = numbers[1:4] # 从索引1到3(不包含4)
print(sub_list) # 输出:[1, 2, 3]
负数索引与步长:
reversed_numbers = numbers[::-1]
print(reversed_numbers) # 输出:[5, 4, 3, 2, 1, 0]
列表的高级特性与技巧
1. 列表推导式(List Comprehensions)
通过一行代码生成复杂列表:
squares = [x**2 for x in range(10)]
print(squares) # 输出:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
条件过滤:
even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares) # 输出:[0, 4, 16, 36, 64]
2. 列表的拼接与复制
-
拼接列表:用
+
或extend()
方法:list1 = [1, 2] list2 = [3, 4] combined = list1 + list2 # 输出:[1, 2, 3, 4] list1.extend(list2) # list1 变为 [1, 2, 3, 4]
-
列表复制:
# 浅拷贝(新列表与原列表共享元素) copy_list = original_list.copy()
3. 嵌套列表与多维数据
列表可以包含其他列表,形成多维结构:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print(matrix[1][2]) # 输出:6(第二行第三列)
列表的内置方法与性能优化
1. 常用内置方法
方法 | 作用 | 示例 |
---|---|---|
append() | 在末尾添加元素 | list.append(x) |
insert() | 在指定位置插入元素 | list.insert(i, x) |
remove() | 删除第一个匹配值 | list.remove(x) |
pop() | 删除并返回指定索引元素 | list.pop(i) |
index() | 获取元素的索引 | list.index(x) |
count() | 统计元素出现次数 | list.count(x) |
sort() | 排序列表(原地修改) | list.sort() |
reverse() | 反转列表顺序 | list.reverse() |
2. 性能注意事项
- 避免频繁插入头部:列表在头部插入元素时,需要移动所有后续元素,时间复杂度为 O(n)。
- 使用生成器表达式:处理大数据集时,用生成器替代列表推导式以节省内存:
# 生成器表达式(节省内存) gen = (x**2 for x in range(1000000))
常见问题与解决方案
1. 列表与元组的区别
- 列表:可变(Mutable),支持增删改。
- 元组:不可变(Immutable),性能更高,适合固定数据。
my_tuple = (1, 2, 3) # 元组无法修改元素
2. 列表深拷贝与浅拷贝
-
浅拷贝:复制一层引用,子对象仍指向原地址:
list_a = [[1, 2], [3, 4]] list_b = list_a.copy() list_b[0][0] = 0 # list_a 和 list_b 的第一个子列表都被修改
-
深拷贝:递归复制所有层级对象:
import copy list_c = copy.deepcopy(list_a) # 修改 list_c 不影响 list_a
3. 列表排序与稳定性
-
sort()
默认按升序排列,可通过reverse=True
反转:numbers = [5, 3, 8, 1] numbers.sort() # [1, 3, 5, 8] numbers.sort(reverse=True) # [8, 5, 3, 1]
-
自定义排序规则:
# 按字符串长度排序 words = ["apple", "banana", "pear"] words.sort(key=lambda x: len(x))
实战案例:用列表解决实际问题
案例1:计算学生平均分
grades = [85, 92, 78, 90, 88]
total = sum(grades)
average = total / len(grades)
print(f"平均分:{average:.1f}") # 输出:86.6
案例2:去重与统计
text = "apple banana apple orange banana"
words = text.split()
word_counts = {}
for word in words:
word_counts[word] = word_counts.get(word, 0) + 1
print(word_counts) # 输出:{'apple': 2, 'banana': 2, 'orange': 1}
案例3:文件名批量处理
filenames = ["report.txt", "image.jpg", "notes.txt"]
txt_files = [f for f in filenames if f.endswith(".txt")]
print(txt_files) # 输出:['report.txt', 'notes.txt']
结论
Python3 列表凭借其灵活性和高效性,成为开发者处理数据的首选工具。从基础的增删改查到高级的列表推导式和多维嵌套,列表能够适应从简单脚本到复杂算法的多样化需求。掌握列表的特性与最佳实践,不仅能提升代码效率,还能为后续学习字典、集合等数据结构打下坚实基础。
希望本文能帮助读者系统化理解 Python3 列表的全貌,并在实际项目中游刃有余地运用这一强大的工具。如需进一步探索,可尝试结合其他数据结构(如字典、集合)设计更复杂的程序逻辑,逐步提升编程能力。