Python 数据结构

  1. 列表 (List)
    1.1 基本特性
python 复制代码
# 创建列表
my_list = [1, 2, 3, 4, 5]
mixed_list = [1, "hello", 3.14, True]
nested_list = [[1, 2], [3, 4], [5, 6]]

# 列表是可变的
my_list[0] = 100  # 修改元素
print(my_list)    # [100, 2, 3, 4, 5]

1.2 常用操作

python 复制代码
# 添加元素
my_list.append(6)           # 末尾添加
my_list.insert(1, 1.5)      # 指定位置插入
my_list.extend([7, 8, 9])   # 扩展列表

# 删除元素
removed = my_list.pop()     # 删除并返回最后一个元素
removed2 = my_list.pop(1)   # 删除指定位置元素
my_list.remove(100)         # 删除第一个匹配的元素
del my_list[0:2]            # 删除切片

# 查找和统计
index = my_list.index(3)    # 查找元素索引
count = my_list.count(2)    # 统计元素出现次数
exists = 3 in my_list       # 检查元素是否存在

# 排序和反转
my_list.sort()              # 升序排序
my_list.sort(reverse=True)  # 降序排序
my_list.reverse()           # 反转列表

# 复制列表
shallow_copy = my_list.copy()
deep_copy = my_list[:]      # 切片复制

1.3 列表推导式

python 复制代码
# 基本推导式
squares = [x**2 for x in range(10)]
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# 带条件的推导式
even_squares = [x**2 for x in range(10) if x % 2 == 0]
# [0, 4, 16, 36, 64]

# 嵌套推导式
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 条件表达式
categorized = ["even" if x % 2 == 0 else "odd" for x in range(5)]
# ['even', 'odd', 'even', 'odd', 'even']

1.4 性能考虑

时间复杂度

python 复制代码
# 时间复杂度
"""
操作        平均情况    最坏情况
索引 O(1)     O(1)
追加 O(1)     O(1)
插入 O(n)     O(n)
删除 O(n)     O(n)
查找 O(n)     O(n)
"""

# 高效操作
# 使用 append() 而不是 insert(0, x)
# 使用集合进行成员测试(如果频繁查找)
  1. 元组 (Tuple)
    2.1 基本特性
python 复制代码
# 创建元组
my_tuple = (1, 2, 3, 4, 5)
single_tuple = (1,)          # 单元素元组需要逗号
empty_tuple = ()
mixed_tuple = (1, "hello", [1, 2, 3])

# 元组是不可变的
# my_tuple[0] = 100  # 这会报错!

# 但包含的可变对象可以修改
mixed_tuple[2].append(4)    # 这是允许的
print(mixed_tuple)          # (1, 'hello', [1, 2, 3, 4])

2.2 常用操作

python 复制代码
# 访问元素
first = my_tuple[0]         # 索引访问
last = my_tuple[-1]         # 负索引
slice = my_tuple[1:4]       # 切片

# 元组解包
a, b, c, d, e = my_tuple
a, b, *rest = my_tuple      # 扩展解包
*a, b, c = my_tuple

# 交换变量
x, y = 10, 20
x, y = y, x                 # 交换 x 和 y

# 函数返回多个值
def get_coordinates():
    return 10, 20, 30

x, y, z = get_coordinates()

2.3 命名元组

python 复制代码
from collections import namedtuple

# 创建命名元组类型
Point = namedtuple('Point', ['x', 'y'])
Color = namedtuple('Color', 'red green blue')

# 使用命名元组
p = Point(10, 20)
c = Color(255, 0, 0)

print(p.x, p.y)            # 10 20
print(c.red)               # 255

# 转换为字典
print(p._asdict())         # {'x': 10, 'y': 20}
  1. 字典 (Dictionary)
    3.1 基本特性
python 复制代码
# 创建字典
person = {"name": "Alice", "age": 25, "city": "Beijing"}
empty_dict = {}
dict_from_pairs = dict([("name", "Bob"), ("age", 30)])

# 字典是可变的
person["age"] = 26                    # 修改值
person["country"] = "China"           # 添加新键值对

3.2 常用操作

python 复制代码
# 访问元素
name = person["name"]                 # 直接访问
age = person.get("age")               # 安全访问
city = person.get("city", "Unknown")  # 带默认值

# 添加和更新
person.update({"age": 27, "gender": "female"})  # 批量更新
person.setdefault("salary", 5000)     # 如果键不存在则设置默认值

# 删除元素
del person["city"]                    # 删除键值对
age = person.pop("age")               # 删除并返回值
key, value = person.popitem()         # 删除并返回最后一对

# 遍历字典
for key in person:                    # 遍历键
    print(key, person[key])

for value in person.values():         # 遍历值
    print(value)

for key, value in person.items():     # 遍历键值对
    print(f"{key}: {value}")

3.3 字典推导式

python 复制代码
# 基本推导式
squares = {x: x**2 for x in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

# 带条件的推导式
even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
# {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}

# 键值交换
inverted = {v: k for k, v in squares.items()}

3.4 特殊字典类型

python 复制代码
from collections import defaultdict, OrderedDict, Counter

# 默认字典
dd = defaultdict(list)
dd["fruits"].append("apple")
dd["fruits"].append("banana")
print(dd["fruits"])  # ['apple', 'banana']
print(dd["vegetables"])  # [] (自动创建空列表)

# 有序字典 (Python 3.7+ 中普通字典已有序)
od = OrderedDict()
od["first"] = 1
od["second"] = 2
od["third"] = 3

# 计数器
counter = Counter("abracadabra")
print(counter)  # Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
print(counter.most_common(2))  # [('a', 5), ('b', 2)]
  1. 集合 (Set)
    4.1 基本特性
python 复制代码
# 创建集合
my_set = {1, 2, 3, 4, 5}
empty_set = set()  # 注意: {} 创建的是空字典
from_list = set([1, 2, 2, 3, 4])  # 自动去重 {1, 2, 3, 4}

# 集合是可变的
my_set.add(6)
my_set.remove(1)  # 如果元素不存在会报错
my_set.discard(10)  # 安全删除,元素不存在也不会报错

4.2 集合运算

python 复制代码
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}

# 并集
union = set1 | set2
union = set1.union(set2)  # {1, 2, 3, 4, 5, 6, 7, 8}

# 交集
intersection = set1 & set2
intersection = set1.intersection(set2)  # {4, 5}

# 差集
difference = set1 - set2
difference = set1.difference(set2)  # {1, 2, 3}

# 对称差集
symmetric_diff = set1 ^ set2  # {1, 2, 3, 6, 7, 8}

# 子集和超集
is_subset = {1, 2}.issubset(set1)  # True
is_superset = set1.issuperset({1, 2})  # True

4.3 集合推导式

python 复制代码
# 基本推导式
squares_set = {x**2 for x in range(10)}
# {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}

# 带条件的推导式
even_squares = {x**2 for x in range(10) if x % 2 == 0}
# {0, 4, 16, 36, 64}

4.4 冻结集合

python 复制代码
# 不可变集合
frozen = frozenset([1, 2, 3, 4, 5])
# frozen.add(6)  # 这会报错!

# 用途:作为字典的键或另一个集合的元素
valid_dict = {frozenset([1, 2]): "set1", frozenset([3, 4]): "set2"}
  1. 字符串 (String)
    5.1 基本操作
python 复制代码
text = "Hello, World!"

# 访问字符
first_char = text[0]        # 'H'
last_char = text[-1]        # '!'
substring = text[0:5]       # 'Hello'

# 字符串是不可变的
# text[0] = 'h'  # 这会报错!

# 创建新字符串
new_text = 'h' + text[1:]   # 'hello, World!'

5.2 常用方法

python 复制代码
text = "  Hello, World!  "

# 大小写转换
lower = text.lower()        # "  hello, world!  "
upper = text.upper()        # "  HELLO, WORLD!  "
title = text.title()        # "  Hello, World!  "

# 去除空白
stripped = text.strip()     # "Hello, World!"
lstrip = text.lstrip()      # "Hello, World!  "
rstrip = text.rstrip()      # "  Hello, World!"

# 查找和替换
position = text.find("World")     # 9
count = text.count("l")           # 3
replaced = text.replace("World", "Python")  # "  Hello, Python!  "

# 分割和连接
words = "apple,banana,cherry".split(",")  # ['apple', 'banana', 'cherry']
joined = "-".join(words)                   # "apple-banana-cherry"
  1. 高级数据结构
    6.1 双端队列 (deque)
python 复制代码
from collections import deque

# 创建双端队列
dq = deque([1, 2, 3, 4])

# 高效操作
dq.append(5)           # 右端添加 [1, 2, 3, 4, 5]
dq.appendleft(0)       # 左端添加 [0, 1, 2, 3, 4, 5]
right = dq.pop()       # 右端删除,返回5
left = dq.popleft()    # 左端删除,返回0

# 限制长度
limited_dq = deque(maxlen=3)
limited_dq.extend([1, 2, 3])  # [1, 2, 3]
limited_dq.append(4)          # [2, 3, 4] (自动删除最左端)

6.2 堆队列 (heapq)

python 复制代码
import heapq

# 创建堆
heap = []
heapq.heappush(heap, 3)
heapq.heappush(heap, 1)
heapq.heappush(heap, 2)
# 堆自动维护最小元素在位置0

# 访问和删除最小元素
smallest = heap[0]        # 1 (不删除)
smallest = heapq.heappop(heap)  # 1 (删除)

# 堆化现有列表
data = [3, 1, 4, 1, 5, 9, 2]
heapq.heapify(data)       # 转换为堆

# 获取n个最大/最小元素
largest = heapq.nlargest(3, data)  # [9, 5, 4]
smallest = heapq.nsmallest(3, data)  # [1, 1, 2]

6.3 链式映射 (ChainMap)

python 复制代码
from collections import ChainMap

# 创建链式映射
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
chain = ChainMap(dict1, dict2)

# 查找顺序:从左到右
print(chain['a'])  # 1 (来自dict1)
print(chain['b'])  # 2 (来自dict1,优先)
print(chain['c'])  # 4 (来自dict2)
相关推荐
q***13612 小时前
Windows操作系统部署Tomcat详细讲解
java·windows·tomcat
合作小小程序员小小店3 小时前
web网页,在线%抖音,舆情,线性回归%分析系统demo,基于python+web+echart+nlp+线性回归,训练,数据库mysql
python·自然语言处理·回归·nlp·线性回归
q***2513 小时前
Python中的简单爬虫
爬虫·python·信息可视化
最晚的py3 小时前
Python Matplotlib
python·数据分析
明洞日记3 小时前
【数据结构手册002】动态数组vector - 连续内存的艺术与科学
开发语言·数据结构·c++
柳鲲鹏3 小时前
OpenCV:文件视频防抖,python版
python·opencv·音视频
fashion 道格3 小时前
数据结构实战:深入理解队列的链式结构与实现
c语言·数据结构
xxxxxxllllllshi4 小时前
【LeetCode Hot100----14-贪心算法(01-05),包含多种方法,详细思路与代码,让你一篇文章看懂所有!】
java·数据结构·算法·leetcode·贪心算法
铁手飞鹰4 小时前
二叉树(C语言,手撕)
c语言·数据结构·算法·二叉树·深度优先·广度优先