打印列表的疑问

  1. class Node:
  2. def __str__(self):
  3. return "haha"
  4. print([Node(),Node()])
  5. print(Node())

输出为

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

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

一个简单的实例

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

  1. import queue
  2. import random
  3. q = queue.PriorityQueue()
  4. class Node:
  5. def __init__(self, x):
  6. self.x = x
  7. def __lt__(self, other):
  8. return other.x > self.x
  9. def __str__(self):
  10. return "{}".format(self.x)
  11. a = [Node(int(random.uniform(0, 10))) for i in range(10)]
  12. for i in a:
  13. print(i, end=' ')
  14. q.put(i)
  15. print("=============")
  16. while q.qsize():
  17. print(q.get(), end=' ')

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

队列和栈

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

  1. L.pop(index=len(L)-1) -> item -- remove and return item at index (default last).
  2. Raises IndexError if list is empty or index is out of range.
  3. L.insert(index, object) -- insert object before index
  4. L.append(object) -> None -- append object to end

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

  1. 入栈:stack.append(node)
  2. 弹栈:stack.pop()
  3. 入队:queue.append(node)
  4. 出队: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值.

  1. class Node:
  2. def __init__(self,x):
  3. self.x=x
  4. def __lt__(self, other):
  5. return self.x<other.x
  6. print(Node(5)==Node(5))

可以定义一个Mixin

  1. class ComparableMixin(object):
  2. def __eq__(self, other):
  3. if type(self) == type(None):
  4. if type(other) == type(None):
  5. return True
  6. else:
  7. return False
  8. elif type(other) == type(None):
  9. return False
  10. else:
  11. return not self<other and not other<self
  12. def __ne__(self, other):
  13. return not __eq__(self, other)
  14. def __gt__(self, other):
  15. return other<self
  16. def __ge__(self, other):
  17. return not self<other
  18. def __le__(self, other):
  19. return not other<self

python中的排序

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

  1. import random
  2. def rand():
  3. return int(random.uniform(0, 10))
  4. a = [(rand(), rand(), rand()) for i in range(10)]
  5. print(a)
  6. a.sort(key=lambda x: x[0] + x[1] + x[2])
  7. print(a)
  8. a = sorted(a, key=lambda x: (x[2], x[0], x[1]))
  9. 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一般实例之四:使用管道和GridSearchCV选择降维

    本例构建一个管道来进行降维和预测的工作:先降维,接着通过支持向量分类器进行预测.本例将演示与在网格搜索过程进行单变量特征选择相比,怎样使用GrideSearchCV和管道来优化单一的CV跑无监督的PC ...

  2. Razor语法中绑定一个值给checkbox

    在ASP.NET MVC开发中,需要绑定一个值给checkbox标签,如下面写法,它们运行时是没有问题,照样能跑. 看看上面的语法,在绑定时,它却出现绿浪线.提不绑定的值is not a valid ...

  3. php-fpm优化

    pid = run/php-fpm.pid #pid设置,默认在安装目录中的var/run/php-fpm.pid,建议开启 error_log = log/php-fpm.log #错误日志,默认在 ...

  4. 读取数据库数据,并将数据整合成3D饼图在jsp中显示

    首先我将生成饼图的方法独立写成一个PieChar.java类,详细代码如下:(数据库需要自己建,如有需要的话) import java.io.IOException; import java.sql. ...

  5. Android Weekly Notes Issue #227

    Android Weekly Issue #227 October 16th, 2016 Android Weekly Issue #227. 本期内容包括: Google的Mobile Vision ...

  6. iOS 设置UILabel的行间距并自适应高度

    NSString *contentStr = @"总以为,在最初的地方,有一个最原来的我,就也会有一个最原来的你"; UILabel *tempLabel = [[UILabel ...

  7. IOS开发基础知识--碎片49

    1:iOS项目配置文件info.plist文件解析 Localization native development region本地化 Executable file可执行文件路径 Bundle id ...

  8. MySQL Performance-Schema(三) 实践篇

    前一篇文章我们分析了Performance-Schema中每个表的用途,以及主要字段的含义,比较侧重于理论的介绍.这篇文章我主要从DBA的角度出发,详细介绍如何通过Performance-Schema ...

  9. C#中DateTime.Ticks属性及Unix时间戳转换

    1.相关概念 DateTime.Ticks:表示0001 年 1 月 1 日午夜 12:00:00 以来所经历的 100 纳秒数,即Ticks的属性为100纳秒(1Ticks = 0.0001毫秒). ...

  10. 浏览器控制台js代码与后台不同步

    原因:浏览器会缓存js 如果是将js代码直接通过<script>标签插入jsp页面中则不存在这个问题 在加载页面的时候会重新加载js代码 如果直接将js代码以文件的形式引入,那么每次在修改 ...