打印列表的疑问

class Node:
   def __str__(self):
      return "haha"

print([Node(),Node()])
print(Node())

输出为

[<__main__.Node object at 0x000000000311A208>, <__main__.Node object at 0x000000000311A358>]
haha

打印列表调用的不是每个元素str吗?看来不是,那调用的是什么.

一个简单的实例

在自定义结点的时候,需要实现__lt__()函数,这样优先队列才能够知道如何对结点进行排序.

import queue
import random

q = queue.PriorityQueue()

class Node:
   def __init__(self, x):
      self.x = x

   def __lt__(self, other):
      return other.x > self.x

   def __str__(self):
      return "{}".format(self.x)

a = [Node(int(random.uniform(0, 10))) for i in range(10)]
for i in a:
   print(i, end=' ')
   q.put(i)
print("=============")
while q.qsize():
   print(q.get(), end=' ')

队列的内部实现是二叉树形式的堆,它最大的缺点在于合并速度慢.然而实际应用中用到合并的场景并不多.如果非要使用可合并堆,可以用斐波那契堆或者二项堆或者左偏树等数据结构.

队列和栈

python列表十分强大,已经完全取代了栈和队列.只需要如下三个函数.

L.pop(index=len(L)-1) -> item -- remove and return item at index (default last).
Raises IndexError if list is empty or index is out of range.

L.insert(index, object) -- insert object before index

L.append(object) -> None -- append object to end

简单来说,就是4个操作:

入栈:stack.append(node)
弹栈:stack.pop()
入队:queue.append(node)
出队:queue.pop(0)

python中的mixin概念

mixin可以为类添加一种行为,它类似接口的概念,但是mixin允许实现许多函数.java现在也已经支持接口的默认函数了,这其实就相当于mixin.
它的实现方式是多继承.java中类的单继承叫"I am",接口的多继承叫"I can".

python的运算符重载

python2使用的只有一个返回int的cmp函数,python3换成了"富比较".只要实现了__lt__()函数就已经实现了__gt__,__le__等函数.但是没有实现eq函数,如下代码输出为False,因为没有实现eq函数.而大于号会调用小于号的实现.
要注意__lt__()函数返回的是bool值.

class Node:
   def __init__(self,x):
      self.x=x
   def __lt__(self, other):
      return self.x<other.x
print(Node(5)==Node(5)) 

可以定义一个Mixin

class ComparableMixin(object):

    def __eq__(self, other):
        if type(self) == type(None):
            if type(other) == type(None):
                return True
            else:
                return False
        elif type(other) == type(None):
            return False
        else:
            return not self<other and not other<self

    def __ne__(self, other):
        return not __eq__(self, other)

    def __gt__(self, other):
        return other<self

    def __ge__(self, other):
        return not self<other

    def __le__(self, other):
        return not other<self  

python中的排序

python2中的sort函数有cmp参数,python3中删掉了,于是只得通过key来指定比较的元素.排序也有两种方法,list.sort()或者是sorted()内置函数.

import random

def rand():
   return int(random.uniform(0, 10))

a = [(rand(), rand(), rand()) for i in range(10)]
print(a)
a.sort(key=lambda x: x[0] + x[1] + x[2])
print(a)
a = sorted(a, key=lambda x: (x[2], x[0], x[1]))
print(a)

python优先队列,队列和栈的更多相关文章

  1. python的队列和栈

    (一)队列和栈的区别 1.队列: 队列是一种特殊的线性表.其两头都有限制,插入只能在表的一端进行(只进不出),而删除只能在表的另一端进行(只出不进),允许删除的一端称为队尾(rear),允许插入的一端 ...

  2. python之单例模式、栈、队列和有序字典

    一.单例模式 import time import threading class Singleton(object): lock = threading.RLock() # 定义一把锁 __inst ...

  3. python数据结构-数组/列表/栈/队列及实现

    首先 我们要分清楚一些概念和他们之间的关系 数组(array)  表(list)  链表(linked list)  数组链表(array list)   队列(queue)  栈(stack) li ...

  4. python 线程队列PriorityQueue(优先队列)(37)

    在 线程队列Queue / 线程队列LifoQueue 文章中分别介绍了先进先出队列Queue和先进后出队列LifoQueue,而今天给大家介绍的是最后一种:优先队列PriorityQueue,对队列 ...

  5. 用两个栈实现队列与用两个队列实现栈(Python实现)

    用两个栈实现队列: class QueueWithTwoStacks(object): def __init__(self): self._stack1 = [] self._stack2 = [] ...

  6. 编程题目: 两个队列实现栈(Python)

    感觉两个队列实现栈 比 两个栈实现队列 麻烦 1.栈为空:当两个队列都为空的时候,栈为空 2.入栈操作:当队列2为空的时候,将元素入队到队列1:当队列1位空的时候,将元素入队到队列2: 如果队列1 和 ...

  7. 数据结构录 之 单调队列&单调栈。

    队列和栈是很常见的应用,大部分算法中都能见到他们的影子. 而单纯的队列和栈经常不能满足需求,所以需要一些很神奇的队列和栈的扩展. 其中最出名的应该是优先队列吧我觉得,然后还有两种比较小众的扩展就是单调 ...

  8. 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)

    目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...

  9. 数据结构录 之 单调队列&单调栈。(转)

    http://www.cnblogs.com/whywhy/p/5066306.html 队列和栈是很常见的应用,大部分算法中都能见到他们的影子. 而单纯的队列和栈经常不能满足需求,所以需要一些很神奇 ...

随机推荐

  1. scikit-learn一般实例之八:多标签分类

    本例模拟一个多标签文档分类问题.数据集基于下面的处理随机生成: 选取标签的数目:泊松(n~Poisson,n_labels) n次,选取类别C:多项式(c~Multinomial,theta) 选取文 ...

  2. Debug Databinding Issues in WPF

    DataBinding is one of the most powerful features in WPF. But because it resolves the bindings at run ...

  3. ToolsCodeTemplate使用

    最近学习使用CodeSmith代码生成器 CodeSmith 是一种语法类似于asp.net的基于模板的代码生成器,程序可以自定义模板,从而减少重复编码的劳动量,提高效率. 作用:CodeSmith ...

  4. c# 九九乘法表

    static void Main(string[] args) { ; i < ; i++) { ; s <= i; s++) { Console.Write(s + "*&qu ...

  5. QML 从无到有 2 (移动适配)

    随着项目深入,需要移植到安卓上,问题来了,QML安卓适配! 幸好PC端程序和手机屏幕长宽比例相似.虽然单位像素,尺寸不同,通过比例缩放,可以实现组件PC和安卓通用代码. 第一步:定义全局的转换函数(3 ...

  6. GJM : Unity3D HIAR -【 快速入门 】 一、简介

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  7. 了解AIDL

    1.什么是AIDL? Android Interface Definition Lauguage(android接口描述语言)是一个IDL语言. 2.AIDL的作用? 背景:在android平台 中, ...

  8. storm0.9.5集群安装

    安装前的准备工作 关闭防火墙 chkconfig iptables off && setenforce 0 创建用户 groupadd realtime && user ...

  9. HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本 ,请添加处理程序。如果下载文件,请添加 MIME 映射。 IIS站点中添加WCF项目后浏览网站报错解决方法。

    vs2013 wcf服务 windows10 家庭中文版 上图中的红色没有出现就按照下面的方法做: 按照上图所示勾选. 刷新上图中你的网站,查看上图右边的内容是否出现,如果出现,再次重新浏览网站,看一 ...

  10. jQuery flickity 滑动触屏

    flickity是一款自适应手机触屏滑动插件,它的API参数很丰富,包括对齐方式.循环滚动.自动播放.是否支持拖动.是否开启分页.是否自适应窗口等. 在线实例 实例演示 使用方法 <div cl ...