Python中主要数据结构和算法的使用

本文详细介绍了Python中数组、双端队列deque、栈stack、优先队列priority_queue、集合set以及映射/字典map等数据结构的实现方法和主要操作。这些数据结构在IT技术中扮演着重要角色,是算法和数据处理的基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构

数组

使用内置类型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]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值