Python 妙用heapq

简介: 小顶堆求TopK大大顶堆求BtmK小题外话Python有一个内置的模块,heapq标准的封装了最小堆的算法实现。下面看两个不错的应用。小顶堆(求TopK大)话说需求是这样的: 定长的序列,求出TopK大的数据。

Python有一个内置的模块,heapq标准的封装了最小堆的算法实现。下面看两个不错的应用。

小顶堆(求TopK大)

话说需求是这样的: 定长的序列,求出TopK大的数据。

import heapq
import random

class TopkHeap(object):
    def __init__(self, k):
        self.k = k
        self.data = []

    def Push(self, elem):
        if len(self.data) < self.k:
            heapq.heappush(self.data, elem)
        else:
            topk_small = self.data[0]
            if elem > topk_small:
                heapq.heapreplace(self.data, elem)

    def TopK(self):
        return [x for x in reversed([heapq.heappop(self.data) for x in xrange(len(self.data))])]

if __name__ == "__main__":
    print "Hello"
    list_rand = random.sample(xrange(1000000), 100)
    th = TopkHeap(3)
    for i in list_rand:
        th.Push(i)
    print th.TopK()
    print sorted(list_rand, reverse=True)[0:3]

大顶堆(求BtmK小)

这次的需求变得更加的困难了:给出N长的序列,求出BtmK小的元素,即使用大顶堆。

算法实现的核心思路是:将push(e)改为push(-e)、pop(e)改为-pop(e)。

class BtmkHeap(object):
    def __init__(self, k):
        self.k = k
        self.data = []

    def Push(self, elem):
        # Reverse elem to convert to max-heap
        elem = -elem
        # Using heap algorighem
        if len(self.data) < self.k:
            heapq.heappush(self.data, elem)
        else:
            topk_small = self.data[0]
            if elem > topk_small:
                heapq.heapreplace(self.data, elem)

    def BtmK(self):
        return sorted([-x for x in self.data])

题外话

目录
相关文章
|
3月前
|
机器人 关系型数据库 Python
【Python篇】Python 类和对象:详细讲解(下篇)
【Python篇】Pyt hon 类和对象:详细讲解(下篇)
41 2
|
3月前
|
存储 数据可视化 数据处理
【Python篇】快速理解Python语法:全面指南
【Python篇】快速理解Python语法:全面指南
79 1
|
7月前
|
数据采集 索引 Python
Python教程:一文弄懂Python字符串(很详细)
字符串是计算机编程中表示文本数据的一种数据类型。在Python和许多其他编程语言中,字符串是由字符序列组成的不可变序列,可以包含字母、数字、符号以及空格等字符。字符串通常用引号括起来表示,可以使用单引号(')、双引号(")或三引号('''或""")来定义。 字符串在计算机编程中有着广泛的应用,例如表示文本信息、文件内容、用户输入等。字符串可以进行各种操作,如连接(拼接)、切片、查找、替换等,同时还支持大小写转换、格式化和正则表达式等高级处理。
170 0
|
8月前
|
机器学习/深度学习 数据可视化 数据挖掘
实用技巧:提高 Python 编程效率的五个方法
本文介绍了五个提高 Python 编程效率的实用技巧,包括使用虚拟环境管理依赖、掌握列表推导式、使用生成器提升性能、利用装饰器简化代码结构以及使用 Jupyter Notebook 进行交互式开发。通过掌握这些技巧,可以让你的 Python 编程更加高效。
|
8月前
|
Python
Python基础语法,如何在一行代码中实现1到100的和?
Python基础语法,如何在一行代码中实现1到100的和?
119 1
|
前端开发 Shell C#
Python(二十三)python字符串比较
Python字符串比较本身是属于python字符串的一部分。 为什么把他拿出来单独说呢,我之前是做web开发,也接触过C#开发,在这两门语言中的字符串比较与python中的字符串比较稍有不同 Python可以使用相等(==)和比较(<,>,!=,<=,> =)运算符执行Python字符串比较。 没有比较两个字符串的特殊方法。 而我目前接触到的其他几门语言 字符串比较好像是只有 == 与 != 两种操作,当然,我也没有在除python的语言中用过 >= 与 <= 来比较字符串。 我们先大概了解下python字符串比较的规则与原理: 比较规则:首先比较两个字符串中的第一个字符,如果相等则继续比较下
169 0
|
XML Shell PHP
Python(十六)python循环语句for、while
Python为我们提供了两种循环,while和for循环。 Python中并没有PHP和C#中的foreach以及do-while循环,这个要注意。 除此之外,python还为我们提供了比较好玩的range函数和pass语句。
79 0
|
Python
python基础语法(十四)
python基础语法(十四)
54 0
|
存储 Python
【Python】学习Python常用函数作用和用法
【Python】学习Python常用函数作用和用法
56 0
|
程序员 Python
Python高级技巧:深入理解Python魔法方法
在 Python 中,魔法方法是指那些以双下划线开头和结尾的特殊方法。它们是 Python 的内置方法,对应于 Python 对象的各种运算符。通过实现这些魔法方法,我们可以改变 Python 对象的行为。这篇文章将深入探讨 Python 的一些魔法方法,并通过示例展示如何使用它们。
Python高级技巧:深入理解Python魔法方法