Python3 数据结构详解

在 Python3 中,数据结构是组织和存储数据的方式,它们决定了数据的访问方式、处理效率以及数据间的关系。Python 提供了多种内置数据结构,如列表(List)、元组(Tuple)、集合(Set)和字典(Dictionary),同时支持通过类来自定义数据结构。下面详细介绍这些数据结构的特点、用法及示例。

一、列表(List)

列表是可变的有序的元素集合,用方括号 [] 表示。列表支持异构数据(可包含不同类型的元素)、索引访问、切片操作和动态调整大小。

核心特点:

  • 动态长度:可随时添加或删除元素。
  • 索引访问:通过 list[index] 访问元素,索引从 0 开始。
  • 支持切片:使用 list[start:stop:step] 获取子列表。
  • 常用方法append()extend()insert()remove()pop()sort()reverse() 等。

示例代码:

# 创建列表
fruits = ["apple", "banana", "cherry"]

# 访问元素
print(fruits[0])       # 输出: apple
print(fruits[-1])      # 输出: cherry(负索引从后往前)

# 修改元素
fruits[1] = "grape"    # 列表可变,修改第二个元素

# 切片操作
print(fruits[1:3])     # 输出: ['grape', 'cherry']

# 添加元素
fruits.append("orange")  # 在末尾添加元素
fruits.insert(1, "lemon")  # 在指定位置插入元素

# 删除元素
fruits.remove("apple")   # 删除指定值的元素
popped = fruits.pop()    # 删除并返回最后一个元素

# 列表操作
print(len(fruits))       # 输出: 3(列表长度)
print("grape" in fruits) # 输出: True(元素是否存在)
 

二、元组(Tuple)

元组是不可变的有序的元素集合,用圆括号 () 表示。元组一旦创建,其元素不能被修改、添加或删除,适合存储不可变数据(如坐标、配置参数)。

核心特点:

  • 不可变性:创建后无法修改,保证数据安全。
  • 索引访问:与列表类似,但不能修改元素。
  • 支持切片:与列表类似,但返回新元组。
  • 常用操作:拼接、计数、查找等。

示例代码:

# 创建元组
coordinates = (10, 20)
person = ("Alice", 30, "Engineer")

# 访问元素
print(coordinates[0])    # 输出: 10

# 元组不可变(以下代码会报错)
# coordinates[0] = 5     # TypeError: 'tuple' object does not support item assignment

# 元组操作
new_coords = coordinates + (30,)  # 拼接元组
print(new_coords)                # 输出: (10, 20, 30)
print(person.count("Engineer"))  # 输出: 1(元素出现次数)
print(person.index(30))          # 输出: 1(元素首次出现的索引)
 

三、集合(Set)

集合是无序的唯一的元素集合,用花括号 {} 或 set() 函数创建。集合主要用于去重和成员检测,支持数学集合运算(如并集、交集、差集)。

核心特点:

  • 无序性:元素没有固定顺序,不能通过索引访问。
  • 唯一性:集合中不允许重复元素。
  • 可变但元素必须可哈希:集合本身可变,但元素必须是不可变类型(如数字、字符串、元组)。
  • 常用操作:并集(|)、交集(&)、差集(-)、对称差集(^)等。

示例代码:

# 创建集合
fruits_set = {"apple", "banana", "cherry"}
empty_set = set()  # 注意:{} 创建的是空字典,必须用 set() 创建空集合

# 自动去重
numbers = {1, 2, 2, 3, 3, 3}
print(numbers)     # 输出: {1, 2, 3}

# 添加元素
fruits_set.add("orange")

# 删除元素
fruits_set.remove("apple")  # 元素不存在时会报错
fruits_set.discard("grape") # 元素不存在时不会报错

# 集合运算
set_a = {1, 2, 3}
set_b = {3, 4, 5}
print(set_a | set_b)        # 并集: {1, 2, 3, 4, 5}
print(set_a & set_b)        # 交集: {3}
print(set_a - set_b)        # 差集: {1, 2}
print(set_a ^ set_b)        # 对称差集: {1, 2, 4, 5}
 

四、字典(Dictionary)

字典是可变的无序的键值对(key-value)集合,用花括号 {} 表示。字典通过键来快速查找对应的值,键必须是唯一且不可变的(如字符串、数字、元组)。

核心特点:

  • 键值对存储:每个值对应一个唯一的键。
  • 快速查找:基于哈希表实现,查找效率为 O (1)。
  • 动态调整:可随时添加、修改或删除键值对。
  • 常用方法get()keys()values()items()update() 等。

示例代码:

# 创建字典
person = {
    "name": "Alice",
    "age": 30,
    "city": "New York"
}

# 访问值
print(person["name"])      # 输出: Alice
print(person.get("age"))   # 输出: 30(使用 get() 避免键不存在时的错误)

# 修改值
person["age"] = 31         # 更新年龄

# 添加新键值对
person["job"] = "Engineer"

# 删除键值对
del person["city"]         # 删除指定键
popped_value = person.pop("age")  # 删除并返回指定键的值

# 字典操作
print(len(person))         # 输出: 2(键值对数量)
print("name" in person)    # 输出: True(检查键是否存在)
print(person.keys())       # 输出: dict_keys(['name', 'job'])
print(person.values())     # 输出: dict_values(['Alice', 'Engineer'])
print(person.items())      # 输出: dict_items([('name', 'Alice'), ('job', 'Engineer')])
 

五、选择合适的数据结构

根据场景选择数据结构时,可参考以下原则:

  • 需要有序且可重复的数据:使用列表(List)。
  • 需要不可变数据:使用元组(Tuple)。
  • 需要去重或集合运算:使用集合(Set)。
  • 需要键值对映射:使用字典(Dictionary)。

六、自定义数据结构

除了内置数据结构,Python 还支持通过类(Class)自定义数据结构。例如,实现一个简单的栈(Stack):

class Stack:
    def __init__(self):
        self.items = []  # 使用列表存储元素
    
    def is_empty(self):
        return len(self.items) == 0
    
    def push(self, item):
        self.items.append(item)  # 入栈操作
    
    def pop(self):
        if self.is_empty():
            raise Exception("Stack is empty")
        return self.items.pop()  # 出栈操作
    
    def peek(self):
        if self.is_empty():
            raise Exception("Stack is empty")
        return self.items[-1]    # 返回栈顶元素
    
    def size(self):
        return len(self.items)   # 返回栈的大小

# 使用自定义栈
stack = Stack()
stack.push(1)
stack.push(2)
print(stack.pop())  # 输出: 2
print(stack.peek()) # 输出: 1

通过掌握这些数据结构及其适用场景,你可以更高效地组织和处理数据,提升代码的可读性和性能。

posted on 2025-11-11 08:43  小陶coding  阅读(57)  评论(0)    收藏  举报