3.1列表(List)与元组(Tuple)

157 阅读3分钟

Python数据结构精讲:列表与元组的全方位解析

# 快速导航
list_sample = ["增删改查", "列表推导式", "性能优化"]
tuple_sample = ("不可变性", "使用场景", "内存优势")

一、核心操作全掌握

1. 列表的动态操作

# 创建与基础操作
colors = ["red", "green"]
colors.append("blue")          # 追加元素 → ["red", "green", "blue"]
colors.insert(1, "yellow")    # 插入元素 → ["red", "yellow", "green", "blue"]
colors[2] = "purple"          # 修改元素 → ["red", "yellow", "purple", "blue"]
​
# 删除操作对比
last = colors.pop()           # 移除末尾 → "blue"
specified = colors.pop(1)     # 移除指定索引 → "yellow"
colors.remove("purple")        # 移除首个匹配值 → ["red"]
​
# 高级切片技巧
matrix = [[1,2], [3,4], [5,6]]
flat = matrix[0] + matrix[1][::-1]  # [1,2] + [4,3][1,2,4,3]

2. 元组的不可变特性

# 元组创建与访问
dimensions = (1920, 1080)
try:
    dimensions[0] = 2560  # 触发TypeError
except TypeError as e:
    print(f"错误信息:{e}")
​
# 元组解包应用
x, y = dimensions  # x=1920, y=1080

操作对比表

操作类型列表元组
修改元素✔️
追加元素✔️
内存占用较大较小
迭代速度较慢较快

二、列表推导式与性能优化

1. 推导式进阶用法

# 常规列表推导式
squares = [x**2 for x in range(10) if x%2==0]  # [0,4,16,36,64]

# 嵌套推导式
matrix = [[1,2], [3,4]]
flatten = [num for row in matrix for num in row]  # [1,2,3,4]

# 带条件的生成器表达式
gen = (x**3 for x in range(1000) if x%3==0)

2. 性能优化实践

import timeit

# 传统循环 vs 推导式
def traditional_loop():
    result = []
    for i in range(10000):
        if i%2==0:
            result.append(i*2)
    return result

def comprehension():
    return [i*2 for i in range(10000) if i%2==0]

print("循环耗时:", timeit.timeit(traditional_loop, number=1000))
print("推导式耗时:", timeit.timeit(comprehension, number=1000))

性能优化要点

  • 推导式比普通循环快约30%
  • 避免在循环内重复计算相同表达式
  • 使用生成器表达式处理大数据集((x for x in ...)
  • 利用切片替代循环修改列表内容

三、元组的六大使用场景

1. 数据完整性保护

# 配置文件示例
DB_CONFIG = ("localhost", 3306, "mydb", "admin", "secure_pwd")

2. 字典键值

locations = {
    (35.6895, 139.6917): "东京",
    (40.7128, -74.0060): "纽约"
}

3. 函数多返回值

def get_file_info(filename):
    return os.path.getsize(filename), os.path.splitext(filename)[1]

4. 格式化字符串

points = (85, 60)
print("坐标位置:X=%d, Y=%d" % points)

5. 线程安全数据结构

# 多线程环境共享数据
shared_data = ("readonly_data", 2023, ["可修改列表"])

6. 内存优化存储

# 存储百万级数据测试
import sys
data_list = [1,2,3,4,5]
data_tuple = (1,2,3,4,5)
print(f"列表内存: {sys.getsizeof(data_list)} 字节")
print(f"元组内存: {sys.getsizeof(data_tuple)} 字节")

四、最佳实践指南

  1. 选择原则

    • 需要修改数据 → 列表
    • 保证数据安全 → 元组
    • 数据规模较大 → 优先元组
    • 需要哈希特性 → 必须元组
  2. 混合使用技巧

    # 元组列表的排序示例
    students = [("Alice", 89), ("Bob", 92), ("Charlie", 85)]
    students.sort(key=lambda x: x[1], reverse=True)
    
  3. 内存优化方案

    # 使用__slots__优化对象存储
    class Point:
        __slots__ = ('x', 'y')  # 替代动态字典
        def __init__(self, x, y):
            self.x = x
            self.y = y
    

扩展思考

  • 当元组包含可变元素(如列表)时,如何保证数据安全性?
  • 在数据处理中如何合理搭配使用列表推导式和生成器表达式?
  • 如何利用元组的不可变性实现高效的数据缓存机制?

下节预告:字典与集合的深度解析——掌握高效数据查询的终极武器