Python提供了多种内置的数据结构,每种数据结构都有其特定的用途和优势。
1. 字符串(String)
字符串是Python中最常用的数据类型之一,用于存储文本数据。具有以下特点:
- 不可变性:字符串一旦创建就不能修改
- 有序性:可以通过索引访问字符
- 支持切片操作
- 丰富的内置方法
- 支持多种格式化方式(f-string、format、%操作符)
- 支持Unicode编码
# 字符串的基本操作(索引和切片)
text = "Hello, Python!"
print(text[0]) # 输出: H
print(text[0:5]) # 输出: Hello
print(len(text)) # 输出: 13
print(text.upper()) # 输出: HELLO, PYTHON!
print(text.lower()) # 输出: hello, python!
# 字符串格式化
name = "Alice"
age = 25
message = f"{name}今年{age}岁" # f-string格式化
print(message) # 输出: Alice今年25岁
# 字符串常用方法
text = " Hello, World! "
print(text.strip()) # 去除首尾空格
print(text.split(",")) # 分割字符串,格式变成了列表
print(",".join(["a", "b", "c"])) # 连接字符串
Python 编程语言中有四种集合数据类型:
- 列表(List)是一种有序和可更改的集合。允许重复的成员。
- 元组(Tuple)是一种有序且不可更改的集合。允许重复的成员。
- 集合(Set)是一个无序和无索引的集合。没有重复的成员。
- 词典(Dictionary)是一个无序,可变和有索引的集合。没有重复的成员。
2. 列表(List)
列表是一个有序、可更改且允许有重复成员的集合。在 Python 中,列表用方括号 [] 编写。具有以下特点:
- 可变性:可以动态添加、删除、修改元素
- 有序性:保持元素的插入顺序
- 支持索引和切片操作
- 可以存储不同类型的元素
- 支持列表推导式
- 内存效率相对较低(因为需要存储额外信息)
- 在中间位置插入/删除元素效率较低
# 列表的基本操作
fruits = ["苹果", "香蕉", "橙子"]
print(fruits[0]) # 输出: 苹果
fruits.append("草莓") # 添加元素
fruits.remove("香蕉") # 删除元素
fruits.sort() # 排序
# 列表推导式
numbers = [1, 2, 3, 4, 5]
squares = [n**2 for n in numbers] # 输出: [1, 4, 9, 16, 25]
# 列表常用方法
fruits = ["苹果", "香蕉", "橙子"]
fruits.extend(["草莓", "葡萄"]) # 扩展列表
fruits.insert(1, "梨") # 在指定位置插入
fruits.pop() # 删除并返回最后一个元素
fruits.count("苹果") # 统计元素出现次数
3. 元组(Tuple)
元组是一个有序、不可变且允许有重复成员的集合。在 Python 中,元组用小括号 () 编写。具有以下特点:
- 不可变性:创建后不能修改
- 有序性:保持元素的插入顺序
- 支持索引和切片操作
- 可以存储不同类型的元素
- 比列表更节省内存
- 可以作为字典的键
- 支持元组解包
- 适合存储不应该被修改的数据
# 元组的基本操作
coordinates = (10, 20)
print(coordinates[0]) # 输出: 10
# 元组解包
x, y = coordinates
print(f"x坐标: {x}, y坐标: {y}") # 输出: x坐标: 10, y坐标: 20
# 元组常用操作
point = (1, 2, 3)
print(len(point)) # 获取长度
print(point.count(1)) # 统计元素出现次数
print(point.index(2)) # 获取元素索引
4. 集合(Set)
集合是无序和无索引的集合,常用于去重和集合运算。在 Python 中,集合用花括号 {} 辨写,具有以下特点:
- 可变性:可以动态添加、删除元素
- 无序性:不保持元素顺序
- 元素必须是不可变类型
- 自动去重
- 查找、插入、删除操作都是O(1)复杂度
- 支持集合运算(交集、并集、差集等)
- 内存效率较高
- 适合去重和集合运算
# 集合的基本操作
fruits = {"苹果", "香蕉", "橙子", "苹果"} # 重复元素会被自动去除
print(fruits) # 输出: {'苹果', '香蕉', '橙子'}
# 集合运算
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
print(set1 & set2) # 交集: {3, 4}
print(set1 | set2) # 并集: {1, 2, 3, 4, 5, 6}
print(set1 - set2) # 差集: {1, 2}
# 集合常用方法
fruits = {"苹果", "香蕉", "橙子"}
fruits.add("草莓") # 添加元素
fruits.remove("香蕉") # 删除元素(不存在会报错)
fruits.discard("香蕉") # 删除元素(不存在不会报错)
fruits.pop() # 随机删除并返回一个元素
5. 字典(Dictionary)
字典是一个无序、可变和有索引的集合。在 Python 中,字典用花括号编写,拥有键和值。
特点:
- 可变性:可以动态添加、删除、修改键值对
- 无序性:Python 3.7+保持插入顺序
- 键必须是不可变类型
- 值可以是任意类型
- 查找、插入、删除操作都是O(1)复杂度
- 支持字典推导式
- 内存占用较大
- 适合存储关联数据
# 字典的基本操作
person = {
"name": "张三",
"age": 30,
"city": "北京"
}
print(person["name"]) # 输出: 张三
person["job"] = "工程师" # 添加新键值对
del person["age"] # 删除键值对
# 字典推导式
squares = {x: x**2 for x in range(5)} # 输出: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 字典常用方法
person = {"name": "张三", "age": 30}
print(person.get("name")) # 安全获取值
print(person.keys()) # 获取所有键
print(person.values()) # 获取所有值
print(person.items()) # 获取所有键值对
person.update({"job": "工程师"}) # 更新字典
6. 数据结构的选择建议
-
字符串:
- 适用场景:文本处理、格式化输出
- 优点:丰富的字符串处理方法
- 缺点:不可变性可能导致内存使用效率问题
-
列表:
- 适用场景:需要频繁修改的序列数据
- 优点:灵活、支持多种操作
- 缺点:在中间位置插入/删除效率低
-
元组:
- 适用场景:不需要修改的序列数据
- 优点:不可变性提供数据安全性,内存效率高
- 缺点:创建后不能修改
-
字典:
- 适用场景:需要键值对映射的数据
- 优点:查找效率高,支持复杂数据结构
- 缺点:内存占用较大
-
集合:
- 适用场景:需要去重或集合运算的数据
- 优点:去重效率高,集合运算方便
- 缺点:无序,不能存储可变类型
7. 性能考虑
时间复杂度关注算法执行速度,选择更快的算法。空间复杂度则关注内存使用,在内存受限时选择更节省空间的算法。
时间复杂度(Time Complexity)
定义:算法执行时间随输入规模增长的变化趋势
常见复杂度(从快到慢):
- O(1) - 常数时间:无论输入多大,执行时间都一样
- O(log n) - 对数时间:执行时间随输入增长而缓慢增长
- O(n) - 线性时间:执行时间与输入规模成正比
- O(n²) - 平方时间:执行时间随输入规模平方增长
- O(2ⁿ) - 指数时间:执行时间呈指数增长
示例:
# O(1) - 数组访问
arr[0] # 直接访问第一个元素
# O(n) - 线性查找
for item in arr: # 需要遍历整个数组
if item == target:
return True
# O(n²) - 冒泡排序
for i in range(n):
for j in range(n): # 嵌套循环
# 排序逻辑
空间复杂度(Space Complexity)
定义:算法执行过程中所需额外空间与输入规模的关系
常见复杂度:
- O(1) - 常数空间:只使用固定大小的额外空间
- O(n) - 线性空间:额外空间与输入规模成正比
- O(n²) - 平方空间:额外空间随输入规模平方增长
示例:
# O(1) - 只用一个变量
arr = [1, 2, 3, 4, 5]
sum = 0
for num in arr:
sum += num
print(sum)
# O(n) - 创建新数组
new_arr = []
for num in arr:
new_arr.append(num * 2)
print(new_arr)
8. 实际应用示例
# 数据处理示例:学生成绩统计系统
def process_student_data(students):
# 使用字典存储学生信息
student_dict = {}
for student in students:
name, score = student
if name not in student_dict:
student_dict[name] = []
student_dict[name].append(score)
# 计算每个学生的平均分
result = {}
for name, scores in student_dict.items():
avg_score = sum(scores) / len(scores)
result[name] = avg_score
return result
# 测试代码
students = [
("张三", 85),
("李四", 92),
("张三", 88),
("王五", 90),
("李四", 95)
]
print(process_student_data(students))
评论区