侧边栏壁纸
博主头像
路小飞博主等级

行动起来,活在当下

  • 累计撰写 72 篇文章
  • 累计创建 12 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

1.6 Python 数据结构

路小飞
2025-06-16 / 0 评论 / 0 点赞 / 17 阅读 / 6937 字

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. 数据结构的选择建议

  1. 字符串:

    • 适用场景:文本处理、格式化输出
    • 优点:丰富的字符串处理方法
    • 缺点:不可变性可能导致内存使用效率问题
  2. 列表:

    • 适用场景:需要频繁修改的序列数据
    • 优点:灵活、支持多种操作
    • 缺点:在中间位置插入/删除效率低
  3. 元组:

    • 适用场景:不需要修改的序列数据
    • 优点:不可变性提供数据安全性,内存效率高
    • 缺点:创建后不能修改
  4. 字典:

    • 适用场景:需要键值对映射的数据
    • 优点:查找效率高,支持复杂数据结构
    • 缺点:内存占用较大
  5. 集合:

    • 适用场景:需要去重或集合运算的数据
    • 优点:去重效率高,集合运算方便
    • 缺点:无序,不能存储可变类型

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))
0

评论区