关闭

python-collections模块

标签: python
153人阅读 评论(0) 收藏 举报
分类:

解压序列,赋值变量

变量数量和序列元素数量相同的时候可以实现多变量赋值,比如:

p = (2, 3)
a, b = p  
# a=2, b=3

content = ["Linda", "Python", 100]
who, class, score = content  
# who="Linda", class="Python", score=100

# 只想解压一部分,可以用任意变量名去占位
content = ["Linda", "Python", 100, "2017-01-03"]
who, _, score, _ = content  
# who="Linda", score=100

# 不确定数量的解压,使用*
content = ["Linda", "Python", 100, 98, 100, "2017-01-03"]
who, class, *score, update_date = content  
# who="Linda", class="Python", score=[100, 98, 100], update_date="2017-01-03"

content = ["Linda", "Python", 100, 98, 100, "2017-01-03"]
who, class, *_, update_date = content  
# who="Linda", class="Python", update_date="2017-01-03"

deque

deque(maxlen=N) 构造函数新建固定大小的队列,当新的元素加入并且队列已满时,最老的元素会被去除。如果想 取序列倒数N个元素,可以将序列依次加入到大小为N的deque中。
如果不设置deque的大小,会得到一个无限大小的队列,可以在队列两端添加和弹出元素。

q = deque()
q.append("a")
q.appendleft("b")
q.pop()
q.popleft() 

heapq

heapqpython里面的堆,具体来说是小顶堆,堆顶元素永远是最小的,所以可以使用heapq.heappop() 弹出剩余元素中最小的一个。heapq模块有两个函数可以用来取最大或最小的N个元素,nlargest(n, sequence, key)nsmallest(n, sequence, key)

# 不指定关键字
import heapq
nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2] heapq.nlargest(3, nums)  # [42, 37, 23]
heapq.nsmallest(3, nums)  # [-4, 1, 2]
# 指定关键字
portfolio = [
{'name': 'IBM', 'shares': 100, 'price': 91.1}, 
{'name': 'AAPL', 'shares': 50, 'price': 543.22}, 
{'name': 'FB', 'shares': 200, 'price': 21.09}, 
{'name': 'HPQ', 'shares': 35, 'price': 31.75}, 
{'name': 'YHOO', 'shares': 45, 'price': 16.35}, 
{'name': 'ACME', 'shares': 75, 'price': 115.65} 
] 
cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price'])
# [
#   {'name': 'YHOO', 'price': 16.35, 'shares': 45}, 
#   {'name': 'FB', 'price': 21.09, 'shares': 200}, 
# ]
expensive = heapq.nlargest(3, portfolio, key=lambda s: s['price'])
# [
#   {'name': 'AAPL', 'price': 543.22, 'shares': 50}, 
#   {'name': 'ACME', 'price': 115.65, 'shares': 75}, 
# ]

需要注意的是,在选取最大或者最小值的时候,heapq并不是最优选择,通常使用max() 或者 min() 会更快一些。当N接近序列长度时,heapq 也不是很好的选择,这时,建议使用先排序再切片的方式,sorted(sequence)[:N] 或者 sorted(sequence)[-N:]

defaultdict & setdefault

一般dictionary都是单值映射,在使用多值映射的时候可以考虑使用defaultdict或者setdefault,看例子:

from collections import defaultdict

d_list = defaultdict(list)
d_list["key1"].append(1)
d_list["key2"].append(2)

d_set = defaultdict(set)
d_set["key1"].add(1)
d_set["key2"].add(2)

这里defaultdict有一个特性,不管之前是否存在要访问的键,在访问之前都会默认为它创建实体,也就是说,使用d["key"]方式获取value的时候,不存在“key”这个关键字也不会报错了,也不同于get("key")返回None,它返回的是一个空的list或者set(这由你之前的定义决定)。不需要这种特性的话,可以选择在普通dict中使用setdefault

d_normal = {}
d_normal.setdefault("a", []).append(1)
d_normal.setdefault("b", {}).add(1)

这里的setdefault里面还可以同一个dictvalue结构可以不一样,当然了用到这个的情况还没有遇到过。

OrderedDict

OrderedDict()可以保持元素的插入顺序。但是有一点需要注意,一个OrderedDict()消耗的空间是一个普通dict的两倍,这是因为OrderedDict()内部还要维护一个根据插入顺序排序双向链表,插入元素时,新插入的元素会被放在链表尾部,对于已经存在的键,重新赋值不会改变顺序。

【未完待更…】

0
0
查看评论

python-collections/itertools

python-collections/itertools
  • sau_lwy
  • sau_lwy
  • 2016-07-23 08:52
  • 111

Unity—项目开发中常用模块(吐血整理笔记摘要)--------持续更新中... ...

一:Socket网络连接模块 使用Protobuf-net解析,有加密功能。 上线商业项目稳定使用中… …二:Assetbundle管理模块 使用AssetBundleManager 插件,上线商业项目稳定使用中… … 上线商业项目稳定使用中… …三:UI框架管理模块 上线商业项目稳定使用...
  • zhaoguanghui2012
  • zhaoguanghui2012
  • 2017-02-09 19:08
  • 815

python多线程编程(一)--thread模块

python提供两个模块支持多线程编程:thread和threading。 thread模块函数 函数 描述 start_new_thread(function,args,kwargs=None) 产生一个新线程,在新线程中用指定参数和可选的kwargs调用function函...
  • whoami021
  • whoami021
  • 2014-03-15 01:57
  • 6119

无法加载模块

改正方法:
  • csiyou
  • csiyou
  • 2014-07-18 21:01
  • 3866

SAP各模块介绍

SAP在管理功能上,它共有12个系统模块,下面为你一一介绍, 希望对你了解SAP有所帮助。   (1)SAP MM模块(物料管理模块),主要有采购、库房与库存管理、MRP、供应商评价等管理功能。   (2)SAP SD模块(销售与分销模块),其中包括销售计划、询价报价、订单管理、运输发货、发票等的...
  • afandaafandaafanda
  • afandaafandaafanda
  • 2015-08-06 06:35
  • 3902

获取模块句柄/基址

#include HMODULE h = GetModuleHandle(NULL);// 传入对应模块名,NULL表示取当前模块 PS:可在属性->链接->高级->基址:修改基址
  • ko999123
  • ko999123
  • 2016-11-12 17:12
  • 1233

laravel 实现 模块式开发

项目需求:   对于中大型和后期考虑扩展和维护的项目,常用的MVC模式肯定不行,于是觉得采用HMVC模式开发有利于后期维护与扩展。   但LARAVEL默认的目录结构式 : /app/   /controllers/      A...
  • timerlau
  • timerlau
  • 2013-11-07 11:32
  • 3064

枚举进程中的模块

在Windows中枚举进程中的模块主要是其中加载的dll,在VC上主要有2种方式,一种是解析PE文件中导入表,从导入表中获取它将要静态加载的dll,一种是利用查询进程地址空间中的模块,根据模块的句柄来得到对应的dll,最后再补充一种利用Windows中的NATIVE API获取进程内核空间中的模块,...
  • lanuage
  • lanuage
  • 2017-05-16 21:22
  • 727

nginx常用模块

rewrite模块 1.url重写由rewrite指令来执行,该指令接受一个模式(正则表达式),后跟一个替换url。 2.rewrite中的匹配使用的正则表达式pcre库 ^   : 匹配开始 $    : 匹配结束  .    ...
  • anderk
  • anderk
  • 2015-12-15 12:38
  • 672

短信模块(一)

最近在学习短信模块,写点东西
  • sjz4860402
  • sjz4860402
  • 2014-11-12 21:13
  • 1355
    个人资料
    • 访问:56283次
    • 积分:1056
    • 等级:
    • 排名:千里之外
    • 原创:47篇
    • 转载:1篇
    • 译文:0篇
    • 评论:11条
    文章分类