1.查找最大或最小的N个元素

  1. import heapq
  2. nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]
  3. print(heapq.nlargest(3, nums)) # Prints [42, 37, 23]
  4. print(heapq.nsmallest(3, nums)) # Prints [-4, 1, 2]
  5.  
  6. # 可以接受关键字参数,用于更复杂的数据结构
  7.  
  8. portfolio = [
  9. {'name': 'IBM', 'shares': 100, 'price': 91.1},
  10. {'name': 'AAPL', 'shares': 50, 'price': 543.22},
  11. {'name': 'FB', 'shares': 200, 'price': 21.09},
  12. {'name': 'HPQ', 'shares': 35, 'price': 31.75},
  13. {'name': 'YHOO', 'shares': 45, 'price': 16.35},
  14. {'name': 'ACME', 'shares': 75, 'price': 115.65}
  15. ]
  16. cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price'])
  17. expensive = heapq.nlargest(3, portfolio, key=lambda s: s['price'])

讨论, 堆数据结构里heap[0]永远是最小的元素,剩余最小的通过heapq.heappop()得到,时间复杂度是O(log N).查找最小的三个可以写成

  1. heapq.heappop(heap)
  2. heapq.heappop(heap)
  3. heapq.heappop(heap)

==>当查找的元素个数相对比较小的时候,nlargest()和nsmallest比较合适.

==>仅查找最大值或最小值, min()和max()函数会更快

==>如果查找的数量跟集合本身差不多大,应该先排序,再使用切片操作sorted(items)[:N]和sorted(items)[-N:]

2.元祖是可以比较大小的

  1. a = (1, 2, 'dandy')
  2. b = (10, 4, 'sam')
  3. c = (1, 3, 'tom')
  4. d = (1, 2, 'dandy1')
  5.  
  6. print(a < b) # True
  7. print(a < c) # True
  8. print(a < d) # True

元祖会按照第一个元素,第二个元素的顺序进行比较大小.

那列表呢?

  1. a = [1, 2]
  2. b = [1, 3]
  3. c = [2, 3]
  4. print(a < b) # True
  5. print(a < c) # True

元祖的混合数据比较呢?

  1. class Foo:
  2. def __init__(self, a):
  3. self.a = a
  4.  
  5. a = (1, 2, [3, 4])
  6. b = (1, 2, [4, 5])
  7. c = (1, Foo(1))
  8. print(a > b) # False
  9. print(a > c)

  10. Traceback (most recent call last):
  11. File "/home/dandy/Documents/charm/cookbook/1算法和数据结构/13test.py", line 32, in <module>
  12. print(a > c)
  13. TypeError: '>' not supported between instances of 'int' and 'Foo'

上面的扩展跳跃性有点强,直接从常用的数据结构扩展到了对象的比较.可以发现报错了,报错内容为Foo类没有实现比较运算符.在一个类内,比较运算符的实现是依赖__lt__, __eq__, __gt__这三个内置函数的,分别对应'<', '==', '>'.在上面的比较内

1.解析a > c

2.比较a和c的第一个元素,a[0] > c[0], 结果是相等,跳到下一个元素

3.比较a和c的第二个元素,a[1] > c[1],此时c[1]是一个实例,以c[1]为中心的话,可以看做foo(1) < a[1],Foo没有实现__lt__这个内置方法.

大结局:只要对象实现上述的三种比较方法__lt__, __eq__, __gt__就可以进行比较大小了,python的对象确实也是这么做的. 很多都是c实现的,__lt__, __eq__, __gt__相当于留给开发人员的外部接口,可以重写或者定义其内置方法.

  1. class Foo:
  2. def __init__(self, a):
  3. self.a = a
  4.  
  5. def __lt__(self, other):
  6. return self.a > other
  7.  
  8. a = (1, 2, [3, 4])
  9. b = (1, 2, [4, 5])
  10. c = (1, Foo(1))
  11. print(a > b) # False
  12. print(a > c) # False

3.字典的默认值

  1. # pairs是一组新增数据,需要按照key,加入到字典d对应的字段的列表内
  2. pairs = {'a': 1, 'b': 2, 'c': 3}
  3.  
  4. d = {}
  5.  
  6. for key, value in pairs:
  7. if key not in d:
  8. d[key] = []
  9. d[key].append(value)

可以用字典的setdefault方法来解决:

  1. pairs = {'a': 1, 'b': 2, 'c': 3}
  2. d = {}
  3.  
  4. for key, value in pairs:
  5. d.setdefault(key, []).append(value)

这样就会方便很多,但还是有点别扭,因为每次调用都要创建一个新的初始值的实例.引入内置的defaultdict,在字典对象申明的时候直接定义好value的对象

  1. d = defaultdict(list)
  2.  
  3. for key, value in pairs:
  4. d[key].append(value)

4.字典比较大小

  1. prices = {
  2. 'ACME': 45.23,
  3. 'AAPL': 612.78,
  4. 'IBM': 205.55,
  5. 'HPQ': 37.20,
  6. 'FB': 10.75
  7. }

比较大小,输出键值

  1. min_price = min(zip(prices.values(), prices.keys()))
  2. # min_price is (10.75, 'FB')
  3. max_price = max(zip(prices.values(), prices.keys()))
  4. # max_price is (612.78, 'AAPL')

排序输出

  1. prices_sorted = sorted(zip(prices.values(), prices.keys()))
  2. # prices_sorted is [(10.75, 'FB'), (37.2, 'HPQ'),
  3. # (45.23, 'ACME'), (205.55, 'IBM'),
  4. # (612.78, 'AAPL')]

讨论通常的做法

  1. min(prices.values()) # Returns 10.75
  2. max(prices.values()) # Returns 612.78
  3.  
  4. min(prices, key=lambda k: prices[k]) # Returns 'FB'
  5. max(prices, key=lambda k: prices[k]) # Returns 'AAPL'
  6.  
  7. # 上面的方式不能输出完整的键值对
  8.  
  9. min_value = prices[min(prices, key=lambda k: prices[k])]
  10. # 需要进行2次查找操作,时间复杂度高

Python Cookbook 数据结构和算法的更多相关文章

  1. [0x00 用Python讲解数据结构与算法] 概览

    自从工作后就没什么时间更新博客了,最近抽空学了点Python,觉得Python真的是很强大呀.想来在大学中没有学好数据结构和算法,自己的意志力一直不够坚定,这次想好好看一本书,认真把基本的数据结构和算 ...

  2. 《用Python解决数据结构与算法问题》在线阅读

    源于经典 数据结构作为计算机从业人员的必备基础,Java, c 之类的语言有很多这方面的书籍,Python 相对较少, 其中比较著名的一本 problem-solving-with-algorithm ...

  3. Python(一)数据结构和算法的20个练习题问答

    数据结构和算法 Python 提供了大量的内置数据结构,包括列表,集合以及字典.大多数情况下使用这些数据结构是很简单的. 但是,我们也会经常碰到到诸如查询,排序和过滤等等这些普遍存在的问题. 因此,这 ...

  4. [0x01 用Python讲解数据结构与算法] 关于数据结构和算法还有编程

    忍耐和坚持虽是痛苦的事情,但却能渐渐地为你带来好处. ——奥维德 一.学习目标 · 回顾在计算机科学.编程和问题解决过程中的基本知识: · 理解“抽象”在问题解决过程中的重要作用: · 理解并实现抽象 ...

  5. python cookbook 数据结构

    保留最后n个元素: from collections import deque def search (lines, pattern, history=): previous_lines = dequ ...

  6. 用python语言讲解数据结构与算法

    写在前面的话:关于数据结构与算法讲解的书籍很多,但是用python语言去实现的不是很多,最近有幸看到一本这样的书籍,由Brad Miller and David Ranum编写的<Problem ...

  7. python数据结构与算法

    最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对p ...

  8. Python数据结构与算法--List和Dictionaries

    Lists 当实现 list 的数据结构的时候Python 的设计者有很多的选择. 每一个选择都有可能影响着 list 操作执行的快慢. 当然他们也试图优化一些不常见的操作. 但是当权衡的时候,它们还 ...

  9. Python数据结构与算法--算法分析

    在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...

随机推荐

  1. resnet代码分析

    1. 先导入使用的包,并声明可用的网络和预训练好的模型 import torch.nn as nn import torch.utils.model_zoo as model_zoo #声明可调用的网 ...

  2. python defaultdict模块

    from collections import defaultdict '''默认值字典'''d = defaultdict(lambda :123)print(d)print(type(d))pri ...

  3. 《JavaScript设计模式与开发实践》笔记第一章

    第一章 面向对象的JavaScript 动态类型语言和鸭子类型 编程语言按照数据类型大体可以分为两类:静态类型语言.动态类型语言. 静态类型语言:在编译时便已确定变量的类型. 优点: 在编译时就能发现 ...

  4. 修改DEDECMS文章标题长度,解决DEDECMS文章标题显示不全

    dedecms系统使用过程中,常遇到输入的标题原本输入的字数跟保存成功后的数字长度不一样,这个是因为 织梦dedecms系统默认的文章标题字数限制是60,也就是只能输入30个汉字,超过的会自动截断删除 ...

  5. mysql 安装 linux系统下

    1.先检查是否安装过mysql,如果没有可进行下面的操作. 2.下载mysql的安装包 cd /usr/local    到这个目录下 mkdir mysql    新建一个mysql文件夹 cd m ...

  6. Java静态代码块、构造代码块执行顺序问题

    package com.zxl.staticdemo; public class BlockTest { static { System.out.println("BlockTest静态代码 ...

  7. Vue.js 2.x笔记:安装与起步(1)

    1. 环境准备 Vue是一套用于构建用户界面的渐进式框架,设计为可以自底向上逐层应用.Vue 的核心库只关注视图层. 安装Node.js,下载:https://nodejs.org/ 查看安装: $ ...

  8. 简单了解python使用正则表达式

    正则[Regular Expression]:正则表达式通常被用来检索.替换那些符合某个模式(规则)的文本. 正则是用来干啥的:正则就是用来匹配字符串的. Python中string的几个方法: fi ...

  9. (最详细)小米Note 3的Usb调试模式在哪里打开的流程

    就在我们使用安卓手机链接PC的时候,或者使用的有些应用软件比如我们单位营销部门就在使用的应用软件引号精灵,之前使用的老版本就需要开启USB开发者调试模式下使用,现就在新版本不需要了,如果手机没有开启U ...

  10. YApi二次开发环境部署

    YApi 是去哪儿网大前端技术中心开源的一个可视化的接口管理平台.下面是在CentOS7下搭建二次开发环境步骤. 1 安装MongoDB 具体安装参考CentOS7安装MongoDB 2 安装Node ...