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
通过掌握这些数据结构及其适用场景,你可以更高效地组织和处理数据,提升代码的可读性和性能。
浙公网安备 33010602011771号