数据结构
数组
使用内置类型list实现,主要有如下操作:
array = []
array.append(1)
length = len(array)
if not array:
# 列表为空
print("array is empty")
队列/双端队列 deque
collections模块提供了deque类,实现了双端队列,允许从队列的两端进行插入和删除操作。
from collections import deque
my_deque = deque()
# 在队列的右侧插入元素
my_deque.append(1)
# 在队列的左侧插入元素
my_deque.appendleft(0)
# 从队列的右侧删除元素
right_element = my_deque.pop()
# 从队列的左侧删除元素
left_element = my_deque.popleft()
# 获取队列的长度
size = len(my_deque)
栈 stack
使用list实现,主要操作如下:
my_stack = []
my_stack.append(1)
# 从栈顶删除元素
removed_element = my_stack.pop()
# 获得栈顶元素
top = my_stack[-1]
优先队列 priority_queue
heapq模块实现了最小堆,可用来充当优先队列,主要操作如下:
import heapq
# 创建一个空的优先队列
heap = []
# 添加元素到优先队列
heapq.heappush(heap, 3)
heapq.heappush(heap, 1)
heapq.heappush(heap, 2)
# 从优先队列中弹出最小元素
min_element = heapq.heappop(heap)
# 推入元素并弹出最小元素
min_element = heapq.heappushpop(heap, 4)
# 访问最小的元素,但不弹出
print(heap[0])
# 将list x转换成堆
x = [4, 2, 1, 3]
heapq.heapify(x)
如果需要使用最大堆,在添加元素和弹出元素的时候,将元素取负即可。
集合 set
在Python中,内置的set类型是一种无序且不重复的数据集合,底层实现方式为哈希表,主要操作如下:
# 创建一个空集合
my_set = set()
# 创建一个包含元素的集合
my_set = {1, 2, 3, 4, 5}
# 添加元素到集合
my_set.add(6)
# 从集合中移除元素
my_set.remove(2)
# 检查元素是否在集合中
is_present = 3 in my_set
# 获取集合的长度(元素个数)
size = len(my_set)
# 进行集合的交集、并集
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
intersection = set1 & set2 # 交集
union = set1 | set2 # 并集
有序集合 SortedSet
元素可重复的情况使用SortedList
from sortedcontainers import SortedSet
# 创建有序集合
s = SortedSet([3, 1, 4, 1, 5, 9, 2])
print(s) # 输出: SortedSet([1, 2, 3, 4, 5, 9])
# 添加元素(自动保持有序)
s.add(6)
print(s) # 输出: SortedSet([1, 2, 3, 4, 5, 6, 9])
# 删除元素
s.discard(4)
val = s.pop(0) # 弹出最小的元素
# 查找操作
print(s[2]) # 获取索引2的元素(5)
print(s.bisect_left(5)) # 查找5的插入位置(2)
映射/字典 map
使用字典实现,底层实现方式为哈希表,主要操作如下:
from collections import defaultdict
# 创建一个空的map,默认值为0
my_map = defaultdict(int)
# 创建一个包含键值对的map
my_map = {'apple': 1, 'banana': 2, 'orange': 3}
# 添加键值对到map
my_map['grape'] = 4
# 获取map中的值
apple_value = my_map['apple']
# 检查键是否存在于map中
is_present = 'banana' in my_map
# 获取map的键的列表和值的列表
keys = list(my_map.keys())
values = list(my_map.values())
# 遍历map中的键值对
for key, value in my_map.items():
print(key, value)
# 删除map中的键值对
del my_map['orange']
# 清空map
my_map.clear()
计数器 Counter
用于高效统计可哈希对象的出现次数。
from collections import Counter
# 从列表创建Counter
words = ['苹果', '香蕉', '苹果', '橙子', '香蕉', '苹果']
word_counts = Counter(words)
print(word_counts)
# 输出: Counter({'苹果': 3, '香蕉': 2, '橙子': 1})
# 从字符串创建Counter
letters = Counter('abracadabra')
print(letters)
# 输出: Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
算法
二分查找
使用bisect库函数,返回第一个 >= target 的位置
import bisect
arr = [1, 3, 5, 7, 9, 11, 13]
# 查找目标值的位置
index = bisect.bisect_left(arr, 7) # 返回第一个 >= target 的位置
if index < len(arr) and arr[index] == 7:
print(f"Found at index {index}") # 输出: Found at index 3
# 查找插入位置
insert_index = bisect.bisect_left(arr, 8)
print(f"Insert at index {insert_index}") # 输出: Insert at index 4
# 实际插入并保持有序
bisect.insort_left(arr, 8)
print(arr) # 输出: [1, 3, 5, 7, 8, 9, 11, 13]