本文内容整理自《Python Cookbook》,仅用作本人学习笔记,若侵犯原著权益请尽快联系本人。


1.将序列分解为单独变量

  • 理解多重赋值
  • 丢弃元素方法
data = ('Kevin', 50, 100, (2017, 2, 28))
name, shares, _, date = data# _ 变量理解为忽略该位置元素

2.从任意长度的可迭代对象中分离元素

  • 理解*args为取序列
record = ('Kevin', 50, 100, (2017, 2, 28))
name, *_,(*_,year) = record# *args会贪婪的获取元祖成员

3.保存最后N个元素

  • 掌握collections.deque用法
  • deque从两端增删元素复杂度为O(1),普通列表从头部删除元素复杂度为O(N)
from collections import deque
q = deque(maxlen=5)
q.append((1,2))
q.append(4)
q.appendleft(3)
print(q)
q.pop()
q.popleft()
print(q)
##print
# deque([3, (1, 2), 4], maxlen=5)
# deque([(1, 2)], maxlen=5)

4.找到最大或最小的N个元素

  • 熟悉堆模块heapq
  • heapq.nlargest(n, list, key)
  • heapq.nsmallest(n, list, key) #key为可自定义函数
  • heapq.heapify(list) #堆化,当list数目较小时比上面快
  • max(),min()在取单个元素时较快
  • 若待取元素数量接近于列表大小,则先排序再切片性能最好(nlargest和nsmallest也会自动判断这个问题)

5.实现优先级队列

  • heapq.heappush(list,item)
  • heapq.heappop(list)
  • 注意默认生成的堆是以优先级小到大的顺序排序的
import heapqclass priorityList(object):def __init__(self):self._queue = []self._index = 0def push(self,item,priority):heapq.heappush(self._queue, (-priority, self._index, item))self._index += 1def pop(self):return heapq.heappop(self._queue)[-1]if __name__ == '__main__':q = priorityList()q.push(5,2)q.push(3,1)q.push(7,1)print(q.pop())print(q._queue)

6.生成一对多字典

  • collections.defaultdict(type)会默认初始化字典key对应的值为“空”
from collections import defaultdictd = defaultdict(list)
for key, value in pairs:d[key].append(value)

7.让字典保持有序

  • collections.OrderedDict()
from collections import OrderedDict
d = OrderedDict()
##然后当字典用

8.与字典有关的计算问题

  • zip(list1,list2)生成一个迭代器内容为list1与list2组合成的元组
min(zip(d.values(), d.keys()))
max(zip(d.values(), d.keys()))

9.两个字典的相同点

  • dict.keys()返回keys-view对象
  • dict.items()返回item-view对象
  • 以上的对象可以进行集合操作 交集 |,差集 -,并集 &
a = {'a':1,'b':2}
c = {key:a[key] for key in a.keys() - ('b')}
# 字典解析

10.序列去重并顺序不变

  • set()集合
  • yield
  • lambda
def depute(items, key=None):s = set()for item in items:val = item if key == None else key(item)if val not in s:yield items.add(val)c = [{'x':1,'y':2},{'x':1, 'y':3},{'x':2, 'y':3}]
print(list(depute(c, lambda d:(d['x']))))

11.对切片命名

  • slice()可用于切片操作
PRICE = slice(2,4)
record = 'AA123456567899'
cost = int(record[PRICE]) * 2

12.找出序列中出现次数最多的元素

  • collections.Counter()
words = ['i','am','i']
word_counts = Counter(words)
print(word_counts.most_common(3))
word_counts['i'] += 1
morewords = ['i','was']
word_counts.update(morewords)

13.通过公共键堆字典列表排序

  • operator.itemgetter
from operator import itemgetter
sorted(d, key=itemgetter('lname'))

14.对不原生支持比较的对象排序

  • sort的key参数
  • lambda
  • operator.attrgetter()

15.根据字段将字典列表分组

  • itertools.groupby() and sort()
  • collections.defaultdict()
from operator import itemgetter
from itertools import groupbyrows.sort(key=itemgetter('date'))
for date, items in groupby(rows, key=itemgetter('date')):for i in items:print(i)

16.筛选序列的元素

  • 列表推导式[ n if n>10 else 0 for n in xrange(20)]
  • 生成器表达式(n if n>10 else 0 for n in xrange(20))
  • filter(function, list)
  • itertools.compress(可迭代对象, 布尔序列)

17.从字典中提取子集

  • 字典推导式{key:value for key,value in prices.items() if value > 200}

18.将名称映射到序列的元素中

  • collections.namedtuple()命名元组
from collections import namedtupleSubscribe = namedtuple('Subscribe',['addr', 'joined'])
sub = Subscribe('openex@qq.com','2016/1/1')
sub = sub._replace(joined=2)
print(sub.addr)
print(sub.joined)

19.同时对数据做转换和换算

  • 在函数参数中使用生成器表达式(函数指sum(),min()等可传入迭代元素函数)
  • 注意max(生成器表达式) 比 max( [生成器表达式] ) 省内存
d= [{'name':'kevin', 'price':1},{'name':"openex", 'price':2}]
print(max(s['price'] * 2 for s in d))
###输出: 4
print(max(d, key=lambda s:s['price'] * -1) )
###输出: {'name': 'kevin', 'price': 1}

20.将多个字典映射为一个字典

  • collections.ChainMap(*maps)
  • map.update(map)
  • ChainMap,在修改和查询时默认操作第一个字典

python进阶-数据结构和算法相关推荐

  1. Python版本的数据结构书_《用Python解决数据结构与算法问题》

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

  2. python中文教程github_GitHub - Virile-Tao/python_data_structures_and_algorithms: Python 中文数据结构和算法教程...

    Python 算法与数据结构视频教程 课程简介 数据结构和算法是每个程序员需要掌握的基础知识之一,也是面试中跨不过的槛.目前关于 Python 算法和数据结构的系统中文资料比较欠缺, 笔者尝试录制视频 ...

  3. 【python版本数据结构与算法】基本概念(10-1)

    参考书: <数据结构与算法(Python语言描述)> 最原始的方法:枚举法 那么数据结构和算法是什么?答曰:兵法! 我们可以不看兵法在战场上肉搏,如此,可能会胜利,可能会失败.即使胜利,可 ...

  4. python数据结构教程_GitHub - Frank-Jing/python_data_structures_and_algorithms: Python 中文数据结构和算法教程...

    Python 算法与数据结构视频教程 课程简介 数据结构和算法是每个程序员需要掌握的基础知识之一,也是面试中跨不过的槛.目前关于 Python 算法和数据结构的系统中文资料比较欠缺, 笔者尝试录制视频 ...

  5. 【python】数据结构和算法 + 浅谈单链表与双链表的区别

    有这么一句话说"程序=数据结构+算法",也有人说"如果把编程比作做菜,那么数据结构就好比食材(菜),算法就好比厨艺(做菜的技巧)". 当然这是笼统的说法,不过也 ...

  6. 用Python解决数据结构与算法问题(一):Python基础

    python学习之路 - 从入门到精通到大师 文章目录 [python学习之路 - 从入门到精通到大师](https://blog.csdn.net/TeFuirnever/article/detai ...

  7. python【数据结构与算法】深入浅出哈希表

    哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列 ...

  8. python【数据结构与算法】剪枝策略

    文章目录 1 剪枝概述 2 例题 1 剪枝概述 剪枝是搜索常用的优化手段,常常能把指数级的复杂度,优化到近似多项式的复杂度.   剪枝是一个比喻:把不会产生答案的,或不必要的枝条"剪掉&qu ...

  9. python【数据结构与算法】计数问题(分治)

    文章目录 1 算法描述 2 实现 3 复杂度 1 算法描述 题目:给定n个整数的数组A以及一个数x,设计一个分治算法,求出x在数组中出现的次数,并分析时间复杂度. 算法思想: 分:先将问题划分为大小近 ...

  10. python【数据结构与算法】最小生成树之Kruskal算法

    我们用现在来模拟一下Kruskal算法,下面给出一个无向图B,我们使用Kruskal来找无向图B的最小生成树. 首先,我们将所有的边都进行从小到大的排序.排序之后根据贪心准则,我们选取最小边(A,D) ...

最新文章

  1. SpringBoot开发案例之整合Activiti工作流引擎
  2. Okhttp-interceptor源码分析,快上车!
  3. 生物科学数据分析和数据管理本体论
  4. SAP CRM WebClient UI cross workcenter的context cleanup
  5. php fckeditor demo,如何使用PHP添加fckeditor
  6. Web存储(Web Storage)介绍
  7. unity AI Planner 人工智能简介
  8. 那些让您相见恨晚的app
  9. 纯css实现那些超炫酷的动画效果
  10. c++ ActiveX基础1:使用VS2010创建MFC ActiveX工程项目
  11. cmd 打开资源监视器
  12. 一、基于workflow-core强势开发审批流【已成功流转50W笔单据】
  13. 小公司需要企业邮箱么?小企业用什么企业邮箱?
  14. Spring_Ioc基本配置使用(基于xml)
  15. python字典改键_python 字典修改键(key)的几种方法
  16. 简单测试IP地址连通性
  17. 导入EXCEL报错:外部表不是预期的格式错误、文件格式和扩展名不匹配,文件可能已损坏或不安全的解决方法
  18. The Frame Buffer
  19. linux surface pro 4 driver,重置出错?微软Win10平板Surface Pro 4重装系统教程详解
  20. 杭州裸辞女孩打脸多少领导:对不起,90后不好骗

热门文章

  1. vscode 终端打开一片空白,无cmd
  2. SpringMVC配拦截器报错[dispatcherServlet]:Servlet.service() for servlet [dispatcherServlet] threw exception
  3. GPIO子系统---(1)应用下操作gpio
  4. 小龟机器人Python开发手册——扩展应用
  5. canvas重点及吃豆人
  6. c++ primer plus学习笔记01
  7. 期权合约的单位是多少?了解期权合约的特点。
  8. number?keyword?傻傻分不清楚
  9. 数据结构--线性表基本操作及其应用
  10. 易语言.尘土界面库2.0版源代码分析(3):窗口的消息处理函数(WndProc)(上)