Ubuntu Spark集群的硬件资源利用率提升可以通过多种方法实现,以下是一些建议: 优化Spark配置:根据集群的规模和任务需求,调整Spark...
2024-11-22 2 最新更新 网站标签 地图导航
在Python中,collections
模块提供了一个双端队列(deque),这是一个高度优化的双向链表数据结构。deque支持在两端高效地添加和删除元素,比列表的操作更为高效。本文将详细介绍deque的功能、用法及其在不同场景下的应用。
deque
(双端队列)是一种通用的队列,支持在两端插入和删除元素。它的实现基于双向链表,因此在两端进行操作的时间复杂度为O(1),而在中间进行插入和删除操作的时间复杂度为O(n)。
首先,导入 deque
类:
froM collections import deque
d = deque([1, 2, 3, 4])
print(d) # 输出:deque([1, 2, 3, 4])
也可以创建一个空的deque:
d = deque()
print(d) # 输出:deque([])
d.append(5)
print(d) # 输出:deque([1, 2, 3, 4, 5])
在左侧添加:使用 appendleft
方法。
d.appendleft(0)
print(d) # 输出:deque([0, 1, 2, 3, 4, 5])
从右侧删除:使用 pop
方法。
d.pop()
print(d) # 输出:deque([0, 1, 2, 3, 4])
从左侧删除:使用 popleft
方法。
d.popleft()
print(d) # 输出:deque([1, 2, 3, 4])
访问元素:可以像访问列表一样通过索引访问元素。
print(d[0]) # 输出:1
print(d[-1]) # 输出:4
修改元素:同样可以通过索引修改元素。
d[0] = 10
print(d) # 输出:deque([10, 2, 3, 4])
可以在创建deque时指定最大长度。当添加元素使deque长度超过指定值时,最旧的元素会被自动移除。
d = deque(maxlen=3)
d.extend([1, 2, 3])
print(d) # 输出:deque([1, 2, 3], maxlen=3)
d.append(4)
print(d) # 输出:deque([2, 3, 4], maxlen=3)
在右侧批量添加:使用 extend
方法。
d.extend([5, 6])
print(d) # 输出:deque([3, 4, 5, 6], maxlen=3)
在左侧批量添加:使用 extendleft
方法。
d.extendleft([7, 8])
print(d) # 输出:deque([8, 7, 3, 4, 5, 6], maxlen=3)
使用 rotate
方法可以旋转deque。正数表示向右旋转,负数表示向左旋转。
d = deque([1, 2, 3, 4, 5])
d.rotate(2)
print(d) # 输出:deque([4, 5, 1, 2, 3])
d.rotate(-3)
print(d) # 输出:deque([2, 3, 4, 5, 1])
由于deque在两端都支持高效的插入和删除操作,因此非常适合作为队列(FIFO)和栈(LIFO)使用。
队列:
queue = deque()
queue.append('task1')
queue.append('task2')
print(queue.popleft()) # 输出:task1
栈:
staCK = deque()
stack.append('task1')
stack.append('task2')
print(stack.pop()) # 输出:task2
在处理需要滑动窗口的场景时,deque的最大长度特性非常有用。例如,计算滑动窗口的平均值:
def moving_average(iterable, n=3):
d = deque(maxlen=n)
for vAlue in iterable:
d.append(value)
if len(d) == n:
print(sum(d) / n)
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
moving_average(data)
# 输出:
# 2.0
# 3.0
# 4.0
# 5.0
# 6.0
# 7.0
# 8.0
在图算法中,deque可以用于实现高效的广度优先搜索(BFS)。
def bfs(graph, start):
visited = set()
queue = deque([start])
while queue:
vertex = queue.popleft()
if vertex not in visited:
visited.add(vertex)
queue.extend(graph[vertex] - visited)
return visited
graph = {
'A': {'B', 'C'},
'B': {'A', 'D', 'E'},
'C': {'A', 'F'},
'D': {'B'},
'E': {'B', 'F'},
'F': {'C', 'E'}
}
print(bfs(graph, 'A'))
# 输出:{'E', 'D', 'F', 'A', 'C', 'B'}
分析说明表:
优点 | 解释 |
---|---|
高效的两端操作 | 在两端插入和删除元素的时间复杂度为O(1),比列表更高效。 |
灵活性 | 既可以作为队列(FIFO),也可以作为栈(LIFO)使用。 |
最大长度限制 | 可以指定最大长度,当长度超过时自动移除最旧的元素,适合实现滑动窗口。 |
双向遍历 | 支持双向遍历,方便实现复杂的数据结构和算法。 |
内置旋转功能 | 通过旋转方法轻松实现元素位置的调整。 |
更高的内存开销 | 由于基于双向链表实现,deque的内存开销相对较高。 |
不适合随机访问 | 由于无法像列表一样通过索引快速访问任意元素,不适合频繁的随机访问场景。 |
deque
是Python中一个非常有用的数据结构,适用于需要高效的双端插入和删除操作的场景。它的灵活性和高效性使其在许多算法和应用中得到了广泛应用。通过本文的介绍,相信读者能够更好地理解和使用 deque
,提升Python编程的效率和效果。
标签: 输出
相关文章
Ubuntu Spark集群的硬件资源利用率提升可以通过多种方法实现,以下是一些建议: 优化Spark配置:根据集群的规模和任务需求,调整Spark...
2024-11-22 2 最新更新 网站标签 地图导航
在 Ubuntu 上使用 PyCharm 时,你可以通过以下步骤启用代码导航工具: 打开 PyCharm。 点击 “File” 菜单,然后选择 “S...
2024-11-22 1 最新更新 网站标签 地图导航
在Ubuntu下配置Privoxy以自动更新其规则集,可以通过以下步骤实现: 安装Privoxy: 如果你还没有安装Privoxy,可以使用以下命...
2024-11-22 2 最新更新 网站标签 地图导航
在Ubuntu上使用PyCharm管理依赖,可以按照以下步骤操作: 打开PyCharm并打开你的项目。 点击 “File” 菜单,然后选择 “Set...
2024-11-22 1 最新更新 网站标签 地图导航
在 Linux 平台下使用 g++ 编译器时,条件编译是一种非常有用的技巧,它允许你根据不同的编译条件(如操作系统、体系结构、编译器版本等)来包含或排...
2024-11-22 3 最新更新 网站标签 地图导航
在 Ubuntu 系统中使用 PyCharm 设置断点的步骤如下: 打开 PyCharm,然后打开你的项目。 在你想要设置断点的代码行左侧的边...
2024-11-22 1 最新更新 网站标签 地图导航
在 Linux 上设置 g++ 以支持代码自动格式化,你可以使用 clang-format 工具。以下是配置步骤: 首先,确保你已经安装了 clan...
2024-11-22 2 最新更新 网站标签 地图导航
在 Linux 上,可以使用 g++ 编译器结合其他工具来进行代码性能分析。以下是一些建议的步骤: 安装 g++ 和相关工具: 确保已经安装了 g...
2024-11-22 2 最新更新 网站标签 地图导航