Python Cookbook
第1章 数据结构和算法
1.1 将序列分解为单独的变量
任何序列(或可迭代的对象)都可以通过一个简单的赋值操作来分解为单独的变量。
| |
1.2 从任意长度的可迭代对象中分解元素
使用*表达式来分解元素。
下面的统计成绩平均分的方法,去掉第一个值和最后一个值,并求值就用了这种方法。
| |
1.3 使用双端队列保存最后N个元素
在处理过程中保留最后N条记录。
| |
可以看到在两端添加数据时,当队列中数据量到达最大值3时,再新增元素时就会将之前的左侧或右侧的数据清理掉,以使新的数据能够填写进来。
1.4 找到最大或最小的N个元素
使用堆队列算法heapq模块。
参考:
这个模块提供了堆队列算法的实现,也称为优先队列算法。
堆是一个二叉树,它的每个父节点的值都只会小于或等于所有孩子节点(的值)。 它使用了数组来实现:从零开始计数,对于所有的 k ,都有
heap[k] <= heap[2*k+1]和heap[k] <= heap[2*k+2]。 为了便于比较,不存在的元素被认为是无限大。 堆最有趣的特性在于最小的元素总是在根结点:heap[0]。
提供了以下函数。
heapq.heappush(heap, item),将值压入到堆中。heapq.heappop(heap),弹出堆中最小的元素。使用heap[0],可以只访问最小的元素而不弹出它。heapq.heapify(x),将列表x原地转换成堆。heapq.nlargest(n, iterable, key=None), 从 iterable 所定义的数据集中返回前 n 个最大的元素。 如果提供了 key 则其应指定一个单参数的函数,用于从每个元素中提取比较键 (例如 key=str.lower)。 等价于:sorted(iterable, key=key, reverse=True)[:n]。heapq.nsmallest(n, iterable, key=None), 从 iterable 所定义的数据集中返回前 n 个最小元素组成的列表。 如果提供了 key 则其应指定一个单参数的函数,用于从 iterable 的每个元素中提取比较键 (例如 key=str.lower)。 等价于:sorted(iterable, key=key)[:n]。
示例:
| |
向堆中插入压入数据:
| |
从堆中弹出数据,会弹出最小数据:
| |
注意事项:
heap[0]最是返回最小那个元素。直接调用heap[0]不会弹出元素。- 如果只是简单找到最小或最大元素,则使用
min或max函数会更快。 - 如果需要找N个最小值或最大值,N值与元素个数本身的大小差不多时,通常更快的方法是先对数据进行排序,然后进行切片操作,如
sorted(items)[:N]。
1.5 优先级队列
实现一个队列,并按给的优先级对元素进行排序,且每次弹出时都会返回优先级最高的那个元素。
实现代码:
| |
运行输出:
| |
