python列表与元组--python005
深入理解列表与元组 —— Python 序列结构全面解析
一、引言
Python 是一种简洁而强大的编程语言,其中「序列类型」(Sequence Types)是核心数据结构之一。列表(list)和元组(tuple)是最常用的两种序列结构。它们在日常编程、数据分析、Web开发、甚至机器学习场景中都扮演着重要角色。本章将深入解析 Python 的列表和元组,涵盖它们的定义、操作方法、常用算法、使用技巧及性能对比等,帮助读者不仅“能用”,更能“用好”。
二、列表(List)
2.1 列表的定义与基本概念
列表是 Python 中最常用的可变序列,使用中括号 []
来定义,内部元素可以是任意类型,甚至嵌套其他列表。
my_list = [1, "hello", 3.14, True]
特点:
支持元素重复;
支持索引访问(正向和负向);
支持切片;
支持动态修改、删除和添加元素;
支持任意类型混合。
2.2 增加元素
Python 提供多种方式添加列表元素:
append(x)
:在末尾追加单个元素insert(i, x)
:在索引i
位置插入元素x
extend(iterable)
:将其他可迭代对象拆分并追加到当前列表末尾使用
+
操作符拼接两个列表
示例:
lst = [1, 2, 3]
lst.append(4) # [1, 2, 3, 4]
lst.insert(1, 'a') # [1, 'a', 2, 3, 4]
lst.extend([5, 6]) # [1, 'a', 2, 3, 4, 5, 6]
2.3 查找元素
in
运算符:判断是否存在index(x)
:返回首次出现的索引(若不存在则抛异常)切片、for 循环迭代等方式遍历列表
lst = [10, 20, 30]
20 in lst # True
lst.index(30) # 2
2.4 修改元素
通过索引直接修改指定位置的值:
lst = [1, 2, 3]
lst[0] = 100 # [100, 2, 3]
还可通过切片批量修改:
lst[1:] = [200, 300] # [100, 200, 300]
2.5 删除元素
pop([i])
:删除并返回索引i
的元素,默认删除最后一个remove(x)
:删除首次出现的值为x
的元素del lst[i]
:使用del
关键字按索引删除clear()
:清空列表
示例:
lst = [1, 2, 3, 2]
lst.pop() # 删除 3
lst.remove(2) # 删除第一个 2
del lst[0] # 删除索引为 0 的元素
lst.clear() # 列表变空
2.6 合并列表
使用
+
:创建新列表使用
extend()
:原地修改原列表
a = [1, 2]
b = [3, 4]
c = a + b # 不影响 a、b
a.extend(b) # a 变为 [1, 2, 3, 4]
2.7 排序与反转
sort()
:原地排序(可传 key 和 reverse)sorted()
:返回新排序列表reverse()
:原地反转reversed()
:返回反转迭代器
lst = [3, 1, 2]
lst.sort() # [1, 2, 3]
sorted(lst) # [1, 2, 3]
lst.reverse() # [3, 2, 1]
三、基于列表的常见算法
3.1 冒泡排序
冒泡排序是一种朴素但易于理解的排序算法:
def bubble_sort(lst):n = len(lst)for i in range(n - 1):for j in range(n - i - 1):if lst[j] > lst[j+1]:lst[j], lst[j+1] = lst[j+1], lst[j]
时间复杂度:O(n²)
虽然效率不高,但对学习算法思想很有帮助。现代开发中更多使用 sorted()
或其他更高效算法如 Timsort、快速排序等。
3.2 列表推导式(List Comprehension)
Python 强大的表达式方式之一,可用于快速构建或处理列表。
squares = [x**2 for x in range(10)] # [0, 1, 4, 9, ..., 81]
四、元组(Tuple)
4.1 基础概念
元组是 不可变的序列,使用小括号 ()
定义:
t = (1, 2, 3)
与列表的区别:
特性 | 列表 list | 元组 tuple |
---|---|---|
可变性 | 可变(mutable) | 不可变(immutable) |
表示方式 | [] | () |
使用场景 | 临时数据、多变数据结构 | 不变数据结构、作为字典键等 |
即使只有一个元素的元组,也要加逗号:
singleton = (1,) # 正确
not_a_tuple = (1) # 实际是 int
4.2 元组操作
支持索引访问和切片
支持
in
运算符支持嵌套、迭代
t = (1, 2, [3, 4])
t[2][0] = 99 # 虽然元组不可变,但其元素若是可变对象仍可变
4.3 应用场景
用于函数返回多个值
用作字典的键
用于集合中元素(可哈希)
五、列表 vs 元组:何时使用?
场景 | 推荐结构 |
---|---|
需要频繁修改元素 | 列表 |
固定结构,不可变数据(如坐标) | 元组 |
作为字典键 | 元组 |
占用空间小、性能更好 | 元组(更快,内存更少) |
性能对比(在大量操作中):
import timeit
print(timeit.timeit('[1, 2, 3, 4, 5]', number=1000000)) # 慢
print(timeit.timeit('(1, 2, 3, 4, 5)', number=1000000)) # 快
六、实际案例与最佳实践
6.1 多变量赋值
x, y = (1, 2)
6.2 函数返回多个值
def get_stats(data):return min(data), max(data)min_val, max_val = get_stats([1, 2, 3])
6.3 排序自定义对象列表
people = [('Tom', 25), ('Jerry', 22)]
people.sort(key=lambda x: x[1]) # 按年龄排序
七、总结
列表和元组是 Python 中最基本、最常用的容器类型;
列表强调灵活性和操作性,适用于动态变化的数据集合;
元组强调结构与稳定性,适用于固定数据结构、函数返回、字典键等场景;
掌握各类操作方法(添加、查找、修改、删除、排序)对日常开发至关重要;
熟悉列表推导式、元组打包/解包等高级语法,有助于写出更简洁、优雅的 Python 代码;
在实际开发中,要根据具体需求选择合适的容器类型,从而写出性能高、结构清晰的代码。