1. 什么是Python列表?

Python列表(List)是Python中最基本、最常用的数据结构之一。它是一个有序、可变的序列,可以存储任意类型的元素,包括数字、字符串、甚至其他列表(嵌套列表)。

简单来说,列表就像是一个可以装下各种物品的“容器”或“购物车”,你可以随时往里面添加、删除或修改物品。

列表的核心特征:

  • 有序性:元素按照插入顺序排列,可以通过位置(索引)访问
  • 可变性:创建后可以修改内容(增删改)
  • 异构性:可以包含不同类型的元素
  • 动态大小:无需预先声明大小,可以随时扩展或收缩

2. 如何创建列表?

Python提供了多种创建列表的方式:

2.1 使用方括号 [](最常用)

# 创建空列表
empty_list = []

# 创建包含元素的列表
numbers = [1, 2, 3, 4, 5]
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
mixed = [1, "hello", 3.14, True, [1, 2, 3]]  # 混合类型

2.2 使用 list() 构造函数

# 从字符串创建(每个字符成为列表元素)
chars = list("Python")  # 结果:['P', 'y', 't', 'h', 'o', 'n']

# 从元组创建
tuple_data = (1, 2, 3)
list_from_tuple = list(tuple_data)  # 结果:[1, 2, 3]

# 从范围创建
numbers = list(range(5))  # 结果:[0, 1, 2, 3, 4]

2.3 使用列表推导式(List Comprehension)

# 创建0-9的平方列表
squares = [x**2 for x in range(10)]
# 结果:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# 创建偶数列表
evens = [x for x in range(20) if x % 2 == 0]
# 结果:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

3. 访问列表元素

3.1 使用索引访问

列表索引从0开始,支持正索引和负索引:

fruits = ["苹果", "香蕉", "橙子", "葡萄", "芒果"]

# 正索引(从左到右)
print(fruits[0])   # "苹果" - 第一个元素
print(fruits[2])   # "橙子" - 第三个元素

# 负索引(从右到左)
print(fruits[-1])  # "芒果" - 最后一个元素
print(fruits[-3])  # "橙子" - 倒数第三个元素

3.2 切片操作(Slicing)

切片用于获取列表的子集,语法:list[start:end:step]

numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 基本切片
print(numbers[2:5])    # [2, 3, 4]    # 索引2到4(不包含5)
print(numbers[:3])     # [0, 1, 2]    # 从开始到索引2
print(numbers[5:])     # [5, 6, 7, 8, 9]  # 从索引5到末尾
print(numbers[:])      # 完整列表的副本

# 带步长的切片
print(numbers[::2])    # [0, 2, 4, 6, 8]  # 每隔一个取一个
print(numbers[1::2])   # [1, 3, 5, 7, 9]  # 从索引1开始每隔一个
print(numbers[::-1])   # 反转列表:[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

4. 修改列表内容

4.1 修改单个元素

fruits = ["苹果", "香蕉", "橙子"]
fruits[1] = "草莓"  # 将"香蕉"改为"草莓"
print(fruits)  # ["苹果", "草莓", "橙子"]

4.2 修改多个元素(切片赋值)

numbers = [1, 2, 3, 4, 5]
numbers[1:4] = [20, 30, 40]  # 替换索引1-3的元素
print(numbers)  # [1, 20, 30, 40, 5]

# 甚至可以替换为不同数量的元素
numbers[1:4] = [100, 200]  # 用两个元素替换三个元素
print(numbers)  # [1, 100, 200, 5]

5. 列表常用操作

5.1 添加元素

fruits = ["苹果", "香蕉"]

# append() - 在末尾添加单个元素
fruits.append("橙子")  # ["苹果", "香蕉", "橙子"]

# extend() - 在末尾添加多个元素(合并列表)
fruits.extend(["葡萄", "芒果"])  # ["苹果", "香蕉", "橙子", "葡萄", "芒果"]

# insert() - 在指定位置插入元素
fruits.insert(1, "草莓")  # 在索引1处插入
# 结果:["苹果", "草莓", "香蕉", "橙子", "葡萄", "芒果"]

5.2 删除元素

fruits = ["苹果", "香蕉", "橙子", "葡萄", "芒果", "香蕉"]

# remove() - 删除第一个匹配的元素
fruits.remove("香蕉")  # 删除第一个"香蕉"
# 结果:["苹果", "橙子", "葡萄", "芒果", "香蕉"]

# pop() - 删除并返回指定位置的元素(默认最后一个)
last_fruit = fruits.pop()  # 删除并返回"香蕉"
print(last_fruit)  # "香蕉"
print(fruits)      # ["苹果", "橙子", "葡萄", "芒果"]

second_fruit = fruits.pop(1)  # 删除并返回索引1的元素
print(second_fruit)  # "橙子"
print(fruits)        # ["苹果", "葡萄", "芒果"]

# del语句 - 删除指定位置或切片
del fruits[0]        # 删除第一个元素
del fruits[1:]       # 删除从索引1开始的所有元素

5.3 查找元素

fruits = ["苹果", "香蕉", "橙子", "葡萄", "芒果", "香蕉"]

# index() - 返回第一个匹配元素的索引
position = fruits.index("香蕉")  # 1
# position = fruits.index("西瓜")  # 会报错:ValueError

# count() - 统计元素出现次数
banana_count = fruits.count("香蕉")  # 2
watermelon_count = fruits.count("西瓜")  # 0

# in运算符 - 检查元素是否存在
has_apple = "苹果" in fruits  # True
has_watermelon = "西瓜" in fruits  # False

5.4 排序和反转

numbers = [3, 1, 4, 1, 5, 9, 2]

# sort() - 原地排序(修改原列表)
numbers.sort()  # 升序排序
print(numbers)  # [1, 1, 2, 3, 4, 5, 9]

numbers.sort(reverse=True)  # 降序排序
print(numbers)  # [9, 5, 4, 3, 2, 1, 1]

# sorted() - 返回新排序列表(不修改原列表)
original = [3, 1, 4]
sorted_list = sorted(original)  # [1, 3, 4]
print(original)  # [3, 1, 4] - 原列表不变

# reverse() - 原地反转
numbers = [1, 2, 3]
numbers.reverse()
print(numbers)  # [3, 2, 1]

6. 列表的复制

6.1 浅复制 vs 深复制

# 浅复制(只复制第一层)
original = [1, 2, [3, 4]]
shallow_copy = original.copy()  # 或 list(original) 或 original[:]

# 修改浅复制中的不可变元素不影响原列表
shallow_copy[0] = 100
print(original)      # [1, 2, [3, 4]] - 不变
print(shallow_copy)  # [100, 2, [3, 4]]

# 修改浅复制中的可变元素(嵌套列表)会影响原列表
shallow_copy[2][0] = 300
print(original)      # [1, 2, [300, 4]] - 被修改了!
print(shallow_copy)  # [100, 2, [300, 4]]

# 深复制(完全独立副本)
import copy
original = [1, 2, [3, 4]]
deep_copy = copy.deepcopy(original)

deep_copy[2][0] = 300
print(original)   # [1, 2, [3, 4]] - 不变
print(deep_copy)  # [1, 2, [300, 4]]

7. 列表推导式进阶

列表推导式是Python中非常强大的特性,可以简化列表创建和转换:

# 基本形式:[expression for item in iterable]
squares = [x**2 for x in range(5)]  # [0, 1, 4, 9, 16]

# 带条件的推导式
even_squares = [x**2 for x in range(10) if x % 2 == 0]  # [0, 4, 16, 36, 64]

# 嵌套循环
pairs = [(x, y) for x in range(3) for y in range(3)]
# [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2), (2,0), (2,1), (2,2)]

# 条件表达式(三元运算)
numbers = [1, -2, 3, -4, 5]
abs_numbers = [x if x >= 0 else -x for x in numbers]  # [1, 2, 3, 4, 5]

# 嵌套列表推导式(矩阵转置)
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
transpose = [[row[i] for row in matrix] for i in range(3)]
# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

8. 列表与其他数据结构的转换

# 列表转字符串
fruits = ["苹果", "香蕉", "橙子"]
str_fruits = ", ".join(fruits)  # "苹果, 香蕉, 橙子"

# 列表转元组(不可变)
tuple_fruits = tuple(fruits)  # ("苹果", "香蕉", "橙子")

# 列表转集合(去重)
numbers = [1, 2, 2, 3, 3, 3]
unique_numbers = set(numbers)  # {1, 2, 3}

# 列表转字典(需要键值对)
pairs = [("a", 1), ("b", 2), ("c", 3)]
dict_from_list = dict(pairs)  # {"a": 1, "b": 2, "c": 3}

9. 性能考虑与最佳实践

9.1 时间复杂度

  • 索引访问:O(1)
  • 追加(append):O(1) 平均
  • 插入(insert):O(n)
  • 删除(pop/remove):O(n)
  • 查找(in/index):O(n)

9.2 最佳实践

# 1. 使用列表推导式代替循环(更简洁高效)
# 不推荐:
result = []
for x in range(10):
    if x % 2 == 0:
        result.append(x**2)

# 推荐:
result = [x**2 for x in range(10) if x % 2 == 0]

# 2. 避免在循环中修改列表长度
# 不推荐:
numbers = [1, 2, 3, 4, 5]
for i in range(len(numbers)):
    if numbers[i] % 2 == 0:
        numbers.pop(i)  # 会改变索引,可能导致错误

# 推荐:
numbers = [1, 2, 3, 4, 5]
numbers = [x for x in numbers if x % 2 != 0]  # 使用列表推导式

# 3. 使用enumerate同时获取索引和值
fruits = ["苹果", "香蕉", "橙子"]
for i, fruit in enumerate(fruits):
    print(f"索引 {i}: {fruit}")

# 4. 使用zip同时遍历多个列表
names = ["Alice", "Bob", "Charlie"]
scores = [85, 92, 78]
for name, score in zip(names, scores):
    print(f"{name}: {score}分")

10. 实际应用示例

10.1 学生成绩管理系统

# 初始化学生列表
students = [
    {"name": "张三", "scores": [85, 90, 78]},
    {"name": "李四", "scores": [92, 88, 95]},
    {"name": "王五", "scores": [76, 82, 80]}
]

# 计算每个学生的平均分
for student in students:
    scores = student["scores"]
    avg_score = sum(scores) / len(scores)
    student["average"] = round(avg_score, 2)

# 按平均分排序
students_sorted = sorted(students, key=lambda x: x["average"], reverse=True)

# 输出结果
print("学生成绩排名:")
for i, student in enumerate(students_sorted, 1):
    print(f"{i}. {student['name']}: 平均分 {student['average']}")

10.2 数据分析:统计词频

# 统计一段文本中单词的出现频率
text = "apple banana apple orange banana apple grape"
words = text.split()  # 分割成单词列表

# 方法1:使用循环
word_count = {}
for word in words:
    word_count[word] = word_count.get(word, 0) + 1

# 方法2:使用collections.Counter
from collections import Counter
word_count = Counter(words)

# 找出出现次数最多的单词
most_common = word_count.most_common(2)
print(f"最常见的单词:{most_common}")

总结

Python列表是一个功能强大且灵活的数据结构,掌握它的使用是Python编程的基础。关键要点:

  1. 创建:使用[]list()或列表推导式
  2. 访问:通过索引和切片获取元素
  3. 修改:使用append()insert()remove()pop()等方法
  4. 操作:排序、反转、查找、计数等
  5. 高级特性:列表推导式、浅复制/深复制
  6. 性能:了解不同操作的时间复杂度,选择合适的方法

列表在Python中无处不在,从简单的数据存储到复杂的数据处理都离不开它。随着你对Python的深入学习,你会发现列表与其他数据结构(如元组、集合、字典)以及各种库(如NumPy、Pandas)的配合使用,能够解决各种实际问题。

记住:实践是最好的老师!多写代码,多尝试不同的列表操作,你会很快掌握这个强大的工具。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐