打印列表的疑问

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 randomq = queue.PriorityQueue()class Node:def __init__(self, x):self.x = xdef __lt__(self, other):return other.x > self.xdef __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 indexL.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=xdef __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 Trueelse:return Falseelif type(other) == type(None):return Falseelse:return not self<other and not other<selfdef __ne__(self, other):return not __eq__(self, other)def __gt__(self, other):return other<selfdef __ge__(self, other):return not self<otherdef __le__(self, other):return not other<self  

python中的排序

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

import randomdef 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)

转载于:https://www.cnblogs.com/weiyinfu/p/6144882.html

python优先队列,队列和栈相关推荐

  1. python实现队列和栈

    python实现队列和栈 1.list 2.collections.deque 3.queue.LifoQueue 1.list 队列:insert列表首部插入,pop() 栈:append列表尾部添 ...

  2. python 用队列实现栈

    | 用队列实现栈 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push.top.pop 和 empty). 实现 MyStack 类: void push(int ...

  3. python 通过队列实现栈

    前言 原理比较简单,不再赘述 code import collections class MyStack:def __init__(self):"""Initialize ...

  4. python 优先队列_python实现最大优先队列 python优先级队列如何最大值优先

    python优先级队列如何最大值优先 啥???????队列默认就有优先级即使告别爱情的时候,也希望你一切都好;小编不再爱你的时候,也许不是小编不爱你,只是,小编已不能再爱你. python3 优先队列 ...

  5. python中的队列和栈_python的队列和栈

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

  6. python 队列与栈的实现

    1.Python数据结构--队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素. 队列是一种先进先出(First-In-First-Out,FIFO)的数据结构.队列被用在很多地方, ...

  7. python 栈和队列_python 栈和队列的基本实现

    python中的列表结构可以用来实现栈和队列. [栈]: 栈是一种数据结构,具有先入后出的特点,并且栈的所有操作只能在某一端进行,能进行操作的一端的第一个元素称为栈顶,另一端的第一个元素称为栈底 栈的 ...

  8. python实现队列_Python学习教程:用队列实现栈

    接着上一期跟大家说的用栈实现队列,这期的 Python学习教程 跟大家讲 用队列实现栈 题目: 使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top() ...

  9. python数据结构与算法——栈、队列与双端队列

    栈 栈:是一种容器,可存入数据元素.访问元素.删除元素,它的特点在于只能允许在容器的一端进行加入数据和输出数据的运算.没有了位置概念,保证任何时候可以访问.删除的元素都是此前最后存入的那个元素,确定了 ...

最新文章

  1. JNDI数据库连接池的配置
  2. Python_Note_08Day_10_03_JQuery
  3. Selenium3自动化测试——2. python编写简单自测代码
  4. Python函数01/函数的初识/函数的定义/函数调用/函数的返回值/函数的参数
  5. c oracle 中文列名,C#获取ORACLE列名的有关问题,这次够详细了吧。求帮助
  6. 斐波那契 非递归写法 非递归实现
  7. 前端工程师笔试题(欢迎评论留言)
  8. Web编码乱码解决原理方案
  9. 2.Linux环境下配置Solr4.10.3
  10. PPT Cookbook by Eric
  11. java执行cmd命令并获取返回结果字符串
  12. Linux给驱动模块传参数(module_param()用法)
  13. 08. 切勿创建包含auto_ptr的容器
  14. 兴趣爱好-常用的10种算法
  15. 如何写数据分析岗位简历?看完瞬间秒懂
  16. 计算机一级ppt加水印,2017年计算机一级WPS辅导:WPSOffice2007中插入水印和改变背景色...
  17. Keil MDK5工程文件不可修改(文件符号上带一个黄色的钥匙)
  18. 介绍MSYS2 在windows下与使用
  19. csdn入门测试教程------mysql数据库命令大全以及常用命令 安装教程 基础知识 附【练习题】
  20. Usage of Pseudocode

热门文章

  1. 3.1.1 Spring 简介
  2. asp.net处理get,post数据
  3. CentOS7中编译安装redis5.0
  4. 【转】VS2013动态库文件的创建及其使用详解
  5. 执行NET 命令无法使用超过20个字符的组名或用户名
  6. GitHub和Microsoft TFS对比有什么优势
  7. ibatis动态的传入表名、字段名
  8. Java 设计模式之普通代理
  9. 通过升级.NET框架提升实体框架性能
  10. Android相关笔记-4