程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

《列表》

hfteth 2025-08-03 04:57:23 技术文章 3 ℃

一、列表基础操作

1. 列表的定义与特性

  • 定义:用方括号[]包裹的有序元素集合,元素可以是任意类型(如数字、字符串、其他列表)。
empty_list = []                     # 空列表
mixed_list = [1, "apple", True, 3.14] # 混合类型列表
nested_list = [[1, 2], ["a", "b"]]  # 嵌套列表
  • 特性
    • 有序:元素按定义顺序排列。
    • 可变:支持增删改操作。
    • 支持重复:允许元素重复出现。

2. 索引与切片

  • 索引:通过[]访问单个元素(从0开始,支持负数索引)。
fruits = ["apple", "banana", "cherry"]
print(fruits   # 输出:apple(第1个元素)
print(fruits[-1])  # 输出:cherry(最后一个元素)
  • 切片:通过[start:end:step]截取子列表。
print(fruits[1:3])   # 输出:['banana', 'cherry'](取索引1-2)
print(fruits[::-1])  # 输出:['cherry', 'banana', 'apple'](反转列表)

3. 常用操作

  • 长度:len(list)
print(len(fruits))  # 输出:3
  • 拼接:+或extend()
new_list = fruits + ["orange"]  # 输出:['apple', 'banana', 'cherry', 'orange']
fruits.extend(["kiwi"])         # 原地扩展列表:['apple', 'banana', 'cherry', 'kiwi']
  • 重复:*
print(["!"] * 3)  # 输出:['!', '!', '!']

二、列表进阶技巧

1. 列表推导式(List Comprehension)

用简洁语法快速生成列表,替代复杂的循环和条件判断。

# 生成1-10的平方
squares = [x**2 for x in range(1, 11)]
print(squares)  # 输出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

# 筛选出偶数
even_numbers = [x for x in range(10) if x % 2 == 0]
print(even_numbers)  # 输出:[0, 2, 4, 6, 8]

2. 嵌套列表与二维列表

通过嵌套列表实现矩阵或表格结构。

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

# 访问元素
print(matrix[0]  # 输出:2(第1行第2列)

# 遍历二维列表
for row in matrix:
    print(row)

3. 排序与反转

  • 原地排序:sort()(修改原列表)。
numbers = [3, 1, 4, 1, 5]
numbers.sort()  # 输出:[1, 1, 3, 4, 5]
  • 返回新列表排序:sorted()(不修改原列表)。
sorted_numbers = sorted(numbers, reverse=True)  # 输出:[5, 4, 3, 1, 1]
  • 反转列表:reverse()
fruits.reverse()  # 输出:['kiwi', 'cherry', 'banana', 'apple']

三、列表内置方法详解

以下是Python列表最常用的方法及其用法:

方法

作用

示例

append(obj)

在列表末尾添加元素

fruits.append("orange")

extend(iterable)

合并另一个可迭代对象到列表末尾

fruits.extend(["kiwi", "mango"])

insert(index, obj)

在指定位置插入元素

fruits.insert(1, "grape")

remove(obj)

删除第一个匹配的元素

fruits.remove("banana")

pop([index])

删除并返回指定索引的元素(默认最后一个)

last_fruit = fruits.pop()

clear()

清空列表

fruits.clear()

copy()

浅拷贝列表

new_fruits = fruits.copy()

count(obj)

统计元素出现次数

fruits.count("apple")

index(obj)

返回元素的第一个匹配索引

fruits.index("cherry")

sort()

原地排序列表(默认升序)

numbers.sort()

reverse()

原地反转列表

numbers.reverse()


四、实际案例:列表的综合应用

案例1:数据处理(统计成绩)

scores = [85, 92, 78, 90, 88]
# 计算总分和平均分
total = sum(scores)
average = total / len(scores)
print(f"总分:{total},平均分:{average:.2f}")  # 输出:总分:433,平均分:86.60

# 筛选高分(≥90)
high_scores = [score for score in scores if score >= 90]
print(high_scores)  # 输出:[92, 90]

案例2:模拟栈(后进先出)

stack = []
stack.append("A")  # 入栈
stack.append("B")
print(stack.pop())  # 输出:B(出栈)
print(stack)        # 输出:['A']

案例3:学生管理系统(增删改查)

students = []

# 添加学生
students.append({"name": "张三", "age": 20, "score": 85})
students.append({"name": "李四", "age": 22, "score": 90})

# 查询学生
print(students[0]["name"])  # 输出:张三

# 修改成绩
students[1]["score"] = 95

# 删除学生
students.pop(0)
print(students)  # 输出:[{'name': '李四', 'age': 22, 'score': 95}]

五、常见问题与解决方案

1. 索引越界错误(IndexError)

现象:IndexError: list index out of range
原因:访问不存在的索引(如空列表或超出长度的索引)。
解决

  • 检查索引范围(如if len(list) > index)。
  • 使用try-except捕获异常。
try:
    print(fruits
except IndexError:
    print("索引超出范围!")

2. 列表与元组的区别

特性

列表

元组

可变性

可修改

不可修改

定义符号

[]

()

性能

更耗内存(动态扩容)

更轻量(固定内存)

适用场景

需要频繁修改的数据

不可变或频繁访问的数据

3. 浅拷贝与深拷贝

  • 浅拷贝:copy()或切片[:](仅复制顶层引用)。
nested = [[1, 2], [3, 4]]
copy_nested = nested.copy()
copy_nested[0][0] = 99  # 原列表也会被修改!
  • 深拷贝:需用copy.deepcopy()(递归复制所有层级)。
import copy
deep_copy = copy.deepcopy(nested)
deep_copy[0][0] = 99    # 原列表不受影响

六、本周练习与答案

练习1:过滤列表中的奇数

用列表推导式从numbers = [1, 2, 3, 4, 5]中提取偶数。
答案

even_numbers = [x for x in numbers if x % 2 == 0]
print(even_numbers)  # 输出:[2, 4]

练习2:合并两个有序列表

合并list1 = [1, 3, 5]和list2 = [2, 4, 6]为有序列表。
答案

merged = sorted(list1 + list2)
print(merged)  # 输出:[1, 2, 3, 4, 5, 6]

练习3:二维列表转置

将matrix = [[1, 2], [3, 4], [5, 6]]转置为[[1, 3, 5], [2, 4, 6]]。
答案

transposed = list(zip(*matrix))
print(list(transposed))  # 输出:[(1, 3, 5), (2, 4, 6)]

七、总结与下一步

  • 核心收获
    • 掌握列表的基础操作(索引、切片、增删改查)。
    • 熟悉列表推导式、内置方法和常见错误处理。
    • 能用列表解决实际问题(数据处理、模拟数据结构)。
最近发表
标签列表