嗨,大家好!今天,我们将深入探讨 Python 中一些强大的列表工具,让您的编程之旅更加得心应手。
Python教程编程技巧
1.阵列模块
首先,我们来谈谈阵列模块。 该模块为我们提供了一个更紧凑、更高效的列表,特别适合存储相似的数据。 看看这个例子,我们可以存储双字节无符号二进制数字数组,而不是通常的 python int 对象列表:
from array import array
a = array('h', [4000, 10, 700, 22222])
print(sum(a))
输出: 26932
print(a[1:3])
输出:array('h', [10, 700])
输出
array('h', [10, 700])
解释
当我们使用from array import array导入数组模块后,我们可以创建一个数组对象,其构造函数的第一个参数是 type,它表示数组中元素的类型。 在这里'h'表示每个元素都是一个双字节无符号短整型(unsigned short),类型可以根据自己的需要选择,例如'i'表示有符号整数。
接下来,我们创建一个数组 a 并初始化一些值 [4000, 10, 700, 22222]。 此数组会将这些值存储为双字节无符号整数。
a = array('h', [4000, 10, 700, 22222])
然后,我们使用 sum(a) 对数组求和。 在这里,数组中的所有元素 (4000 + 10 + 700 + 22222) 将被汇总为 26932 的输出。
print(sum(a))
输出: 26932
最后,我们使用切片操作 a[1:3] 获取数组中索引从 1 到 2(不包括索引 3)的元素并输出它们。 此处的输出是一个新数组,其中包含索引为 1 到 2 [10, 700] 的原始数组的元素。
print(a[1:3])
输出:array('h', [10, 700])
总体而言,本节演示了如何创建和操作包含双字节数组模块。
无符号整数数组,通过求和和切片运算演示数组的灵活性和功能。 这在处理大量数值数据时非常有用,尤其是在需要更紧凑的存储和高性能时。
2.双端队列 (deque)。
接下来,让我们看一下双端队列,它是一个类似列表的对象,但在左侧的追加和弹出速度更快。 它非常适合实现队列和广度优先搜索
from collections import deque
def gen_moves(node):
为给定的字符串节点生成所有可能的子字符串。
moves =
for i in range(len(node)):
for j in range(i + 1, len(node) +1):
moves.append(node[i:j])
return moves
def is_goal(node):
在此示例中,目标状态是字符串长度为 5 的字符串。
return len(node) == 5
创建一个双端队列来表示待处理任务的列表。
d = deque(["task1", "task2", "task3"])
将是一项新任务"task4"添加到队列的尾部。
d.append("task4")
本节显示双端队列中任务的处理过程。
print("original task list:", d)
print("handling", d.popleft())
print("updated task list:", d)
定义起始节点。
starting_node = "initial_node"
创建包含起始节点的双端队列。
unsearched = deque([starting_node])
定义广度优先的搜索函数。
def breadth_first_search(unsearched):
队列左侧弹出一个节点。
node = unsearched.popleft()
移动当前节点。
for m in gen_moves(node):
如果达到目标状态,则返回结果。
if is_goal(m):
return m
将新节点添加到队列中。
unsearched.append(m)
演示广度优先搜索的过程。
print("unsearched nodes:", unsearched)
在广度优先搜索过程中,判断是否达到目标状态。
result = breadth_first_search(unsearched)
print("result of breadth-first search:", result)
输出
original task list: deque(['task1', 'task2', 'task3', 'task4'])
handling task1
updated task list: deque(['task2', 'task3', 'task4'])
unsearched nodes: deque(['initial_node'])
result of breadth-first search: initi
解释
is goal 函数检查字符串的长度是否等于 5,表示已达到目标状态。 在实际问题中,您需要根据搜索目标定义 is 目标函数,以确保它满足问题的要求。
3.二分模块
除了基本的列表操作之外,我们还有 bisect 模块,它提供了在排序列表中执行二进制查找的能力:
import bisect
scores = [(100, 'perl'), 200, 'tcl'), 400, 'lua'), 500, 'python')]
bisect.insort(scores, (300, 'ruby'))
print(scores)
输出:[100,.]'perl'), 200, 'tcl'), 300, 'ruby'), 400, 'lua'), 500, 'python')]
输出
[(100, 'perl'), 200, 'tcl'), 300, 'ruby'), 400, 'lua'), 500, 'python')]
解释
bisect.insort(scores, (300, 'ruby')):此行将添加元组(300,'ruby') 添加到排序后的分数列表中。insort 函数可确保列表在插入后保持排序状态。
print(scores):此行打印插入的分数列表。
请注意,新元组 (300,'ruby') 正确插入到乐谱中,并且列表仍按升序排序。此技术对于需要保持排序的动态数据集非常有用。
4.HEAPQ 模块
最后,让我们看一下 HEAPQ 模块,它提供了一个基于堆的通用列表。 这对于重复访问最小元素很有用,但您不想运行完整的列表排序:
from heapq import heapify, heappop, heappush
data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
heapify(data)
heappush(data, -5)
print([heappop(data) for i in range(3)])
输出:[5, 0, 1]。
输出
解释
heapify(data):此行使用 heapify 函数将列表数据转换为堆。 堆是一种特殊的树状数据结构,其中每个节点的值小于或等于其子节点的值。
heappush(data, -5):此行使用 heappush 函数将新元素 -5 推送到堆中。 这将保持堆的性质,即堆中任何节点的值小于或等于其子节点的值。
heappop(data) for i in range(3)]:此行使用列表推理,并在循环中执行 heappop(data) 三次,每次弹出堆中的最小元素。由于堆的性质,每个弹出的元素都是堆中的最小元素。
print(result):最后,打印结果,即前三个最小的元素。 输出为 [-5, 0, 1]。
这种使用堆的方法非常适合需要维护动态集合中最小元素的情况,因为在堆中插入和弹出最小元素的时间复杂度为 o(log n)。
这就是我们今天分享的关于 Python 列表工具的内容!希望这些工具能在您的编码之旅中为您提供帮助。 如果您有任何问题或想了解更多关于工具的信息,请在评论区发表评论,我会尽力回答。 记得点赞、分享、订阅,在编程的道路上与你同在!感谢您的收看,我们下期再见!