Python collections模块总结

除了我们使用的那些基础的数据结构,还有包括其它的一些模块提供的数据结构,有时甚至比基础的数据结构还要好用。

collections

ChainMap

这是一个为多个映射创建单一视图的类字典类型,也就是说,它同样具有字典类型的方法,它比基础数据结构中的字典的创建和多次更新要快,需要注意的是,增删改的操作都只会针对该对象的第一个字典,其余字典不会发生改变,但是如果是查找,则会在多个字典中查找,直到找到第一个出现的key为止。

特有方法 解释
maps 返回全部的字典(这个列表中至少存在一个列表)
new_child 在字典列表头部插入字典,如果其参数为空,则会默认插入一个空字典,并且返回一个改变后的ChainMap对象
parents 返回除了第一个字典的其余字典列表的ChainMap对象,可以用来查询除了第一个列表以外的内容。
import collections
a = {1: 2, 2: 3}
b = {1: 3, 3: 4, 4: 5}
chains = collections.ChainMap(a, b)
# maps
# 注意maps是个属性,不是一个方法,其改变
print(chains.maps) # [{1: 2, 2: 3}, {1: 3, 3: 4, 4: 5}]
# get
assert chains.get(1, -1) == 2
# parents
# 从第二个map开始找
assert chains.parents.get(1, -1) == 3
# popitem
assert chains.popitem() == (2, 3)
# pop
# 返回的是value
assert chains.pop(1) == 2
# new_child
assert chains.new_child()
print(chains.maps) # [{}, {1: 3, 3: 4, 4: 5}]
chains[2] = 1
print(chains.maps) # [{2: 1}, {1: 3, 3: 4, 4: 5}]
# setdedault
# 如果已经存在key,则不会添加
assert chains.setdefault(1, 10) == 3
# update
chains.update({2: 4, 3: 5})
print(chains.maps) # [{1: 2, 2: 4, 3: 5}, {1: 3, 3: 4, 4: 5}]
# keys
print(chains.keys()) # KeysView(ChainMap({2: 4, 3: 5}, {1: 3, 3: 4, 4: 5}))
# KeysView 继承了mapping和set
print(2 in chains.keys()) # True
print(len(chains.keys())) # 4(重复的不算)
# clear
chains.clear()
print(chains.maps) # [{}, {1: 3, 3: 4, 4: 5}]

就像它的特点一样,它适用于以下的情况:

  1. 多个字典;
  2. 允许key是重复;
  3. 总是访问最高优先级字典中的关键字;
  4. 不需要改变key对应的value;
  5. 字典频繁的创建和更新已经造成巨大的性能问题,希望改善性能问题;

Counter

这是一个继承dict的子类,专门用来做计数器,dict中的方法这里同样适用。

特有方法 解释
init 初始化,参数为可迭代对象即可
elememts 返回一个生成器,其键值以无序的方式返回,并且只有值大于1的键值对才会返回
most_common 返回值最大的键值对,参数指定返回前多少个
subtract 减法,调用者的值发生改变
update 加法,调用者的值发生改变
[] 返回键对应的值,如果键不存在,那么返回0
+ 加法,返回一个新的counter对象,如果前面不存在,则默认加上一个对应键,值为0的counter
- 减法,返回一个新的counter对象,如果前面不存在,则默认用对应键,值为0的counter来减,其中值正数会变负数,负数变为正数
& min操作,取相对应的键的最小值,返回一个新的counter对象
max操作,取相对应的键的最大值,返回一个新的counter对象

其中数学运算如果其中一方的不存在,则会默认创建对应键,值为0的键值对。

from collections import Counter
# init
# 可迭代
counter = Counter("accab") # Counter({'a': 2, 'c': 2, 'b': 1})
counter2 = Counter([1,2,3,4]) # Counter({1: 1, 2: 1, 3: 1, 4: 1})
counter5 = Counter([('a',3),('b', 2)]) # Counter({('a', 3): 1, ('b', 2): 1})
# 字典
counter3 = Counter({'a': 1, 'b': 2, 'a': 3}) # Counter({'a': 3, 'b': 2})
counter4 = Counter(a=1, b=2, c=1) # Counter({'b': 2, 'a': 1, 'c': 1})
# elements
# 键值以无序的方式返回,并且只返回值大于等于1的键值对
elememts = counter.elements()
print([x for x in elememts]) # ['a', 'a', 'c', 'c', 'b']
# 为空是因为elements是generator
print(sorted(elememts)) # []
# most_common
# 键值以无序的方式返回
print(counter.most_common(1)) # [('a', 2)]
print(counter.most_common()) # [('a', 2), ('c', 2), ('b', 1)]
# update
# 单纯是增加的功能,而不是像dict.update()中的替换一样
counter.update("abb")
print(counter) # Counter({'a': 3, 'b': 3, 'c': 2})
# subtract
counter.subtract(Counter("accc"))
print(counter) # Counter({'b': 3, 'a': 2, 'c': -1})
print([x for x in counter.elements()]) # ['a', 'a', 'b', 'b', 'b']
# get
# 键不存在则返回0,但是不会加入到counter键值对中
print(counter['d'])
print(counter) # Counter({'b': 3, 'a': 2, 'c': -1})
del counter['d']
# 还可以使用数学运算
c = Counter(a=3, b=1)
d = Counter(a=1, b=2)
# add two counters together: c[x] + d[x]
print(c + d) # Counter({'a': 4, 'b': 3})
# subtract (keeping only positive counts)
print(c - d) # Counter({'a': 2})
# # intersection: min(c[x], d[x])
print(c & d) # Counter({'a': 1, 'b': 1})
# union: max(c[x], d[x])
print(c | d) # Counter({'a': 3, 'b': 2})
# 一元加法和减法
c = Counter(a=3, b=-1)
# 只取正数
print(+c) # Counter({'a': 3})
print(-c) # Counter({'b': 1})

deque

由于deque同样能够提供列表相关的函数,所以其和列表相同的函数则不再赘述,这里比较独特的是和left相关的函数以及rotate函数。

from collections import deque
# 从尾部进入,从头部弹出,保证长度为5
dq1 = deque('abcdefg', maxlen=5)
print(dq1) # ['c', 'd', 'e', 'f', 'g']
print(dq1.maxlen) # 5
# 从左端入列
dq1.appendleft('q')
print(dq1) # ['q', 'c', 'd', 'e', 'f']
# 从左端入列
dq1.extendleft('abc')
print(dq1) # ['c', 'b', 'a', 'q', 'c']
# 从左端出列并且返回
dq1.popleft() # c
print(dq1) # ['b', 'a', 'q', 'c']
# 将队头n个元素进行右旋
dq1.rotate(2)
print(dq1) # ['q', 'c', 'b', 'a']
# 将队尾两个元素进行左旋
dq1.rotate(-2)
print(dq1) # ['b', 'a', 'q', 'c']
def tail(filename, n=10):
'Return the last n lines of a file'
with open(filename) as f:
return deque(f, n)
def delete_nth(d, n):
"""
实现队列切片和删除,pop之后再放会原处
:param d: deque
:param n: int
:return:
"""
d.roatte(-n)
d.popleft()
d.rotate(n)

OrderedDict

OrderedDict提供了一个有序字典,可以使用在遍历的时候根据相应的顺序进行输出,因为在dict中它的item是以任意顺序进行输出的。

注意初始化的时候和在插入的话都根据插入顺序进行排序,而不是根据key进行排序。

from collections import OrderedDict
items = {'c': 3, 'b': 2, 'a': 1}
regular_dict = dict(items)
ordered_dict = OrderedDict(items)
print(regular_dict) # {'c': 3, 'b': 2, 'a': 1}
print(ordered_dict) # [('c', 3), ('b', 2), ('a', 1)]
# 按照插入顺序进行排序而不是
ordered_dict['f'] = 4
ordered_dict['e'] = 5
print(ordered_dict) # [('c', 3), ('b', 2), ('a', 1), ('f', 4), ('e', 5)]
# 把最近加入的删除
print(ordered_dict.popitem(last=True)) # ('e', 5)
# 按照加入的顺序删除
print(ordered_dict.popitem(last=False)) # ('c', 3)
print(ordered_dict) # [('b', 2), ('a', 1), ('f', 4)]
# 移动到末尾
ordered_dict.move_to_end('b', last=True)
print(ordered_dict) # [('a', 1), ('f', 4), ('b', 2)]
# 移动到开头
ordered_dict.move_to_end('b', last=False)
print(ordered_dict) # [('b', 2), ('a', 1), ('f', 4)]
ordered_dict['a'] = 3
# 说明更改值并不会影响加入顺序
print(ordered_dict.popitem(last=True)) # ('f', 4)

提供了字典的功能,又保证了顺序。

namedtuple

如果我们想要在tuple中使用名字的参数,而不是位置,namedtuple提供这么一个创建名称tuple的机会。

from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, y=20)
print(p) # Point(x=10, y=20)
print(p.x + p.y) # 30

Python collections模块总结的更多相关文章

  1. (转)python collections模块详解

    python collections模块详解 原文:http://www.cnblogs.com/dahu-daqing/p/7040490.html 1.模块简介 collections包含了一些特 ...

  2. python collections模块

    collections模块基本介绍 collections在通用的容器dict,list,set和tuple之上提供了几个可选的数据类型 namedtuple() factory function f ...

  3. Python collections 模块用法举例

    Python作为一个“内置电池”的编程语言,标准库里面拥有非常多好用的模块.比如今天想给大家 介绍的 collections 就是一个非常好的例子. 1.collections模块基本介绍 我们都知道 ...

  4. Python——collections模块、time模块、random模块、os模块、sys模块

    1. collections模块 (1)namedtuple # (1)点的坐标 from collections import namedtuple Point = namedtuple('poin ...

  5. Python——collections模块

    collections模块 collections模块在内置数据类型(dict.list.set.tuple)的基础上,还提供了几个额外的数据类型:ChainMap.Counter.deque.def ...

  6. python collections模块详解

    参考老顽童博客,他写的很详细,例子也很容易操作和理解. 1.模块简介 collections包含了一些特殊的容器,针对Python内置的容器,例如list.dict.set和tuple,提供了另一种选 ...

  7. python collections模块 之 defaultdict

    defaultdict 是 dict 的子类,因此 defaultdict 也可被当成 dict 来使用,dict 支持的功能,defaultdict 基本都支持.但它与 dict 最大的区别在于,如 ...

  8. python collections 模块 之 deque

    class collections.deque(iterable[,maxlen]): 返回 由可迭代对象初始化的 从左向右的 deque 对象. maxlen: deque 的最大长度,一旦长度超出 ...

  9. python collections 模块 之namedtuple

    namedtuple collections.namedtuple(typename, filed_name, *, rename=False, module=None) 创建一个以 typename ...

随机推荐

  1. 以太坊RLP用法-go-ethereum学习

    RLP (递归长度前缀)提供了一种适用于任意二进制数据数组的编码,RLP已经成为以太坊中对对象进行序列化的主要编码方式.RLP的唯一目标就是解决结构体的编码问题:对原子数据类型(比如,字符串,整数型, ...

  2. Win10无法连接远程桌面提示“你的凭据不工作”的三个解决方法

    Win10无法连接远程桌面提示"你的凭据不工作"的三个解决方法(转藏) 解决方法一:修改组策略 1.在"开始"窗口运行gpedit.msc,进入计算机配置-&g ...

  3. WebSocket和kafka实现数据实时推送到前端

    一. 需求背景      最近新接触一个需求,需要将kafka中的数据实时推送到前端展示.最开始想到的是前端轮询接口数据,但是无法保证轮询的频率和消费的频率完全一致,或造成数据缺失等问题.最终确定用利 ...

  4. Nmap在实战中的高级用法

    Nmap提供了四项基本功能(主机发现.端口扫描.服务与版本侦测.OS侦测)及丰富的脚本库.Nmap既能应用于简单的网络信息扫描,也能用在高级.复杂.特定的环境中:例如扫描互联网上大量的主机:绕开防火墙 ...

  5. myeclipse导入项目时出现Exploded location overlaps an existing deployment错误解决方法

    版权声明:本文为博主原创文章,转载时请注明原文链接. 今天拿别人的项目,在自己的软件上配置,通过tomcat添加项目时出现了 Exploded location overlaps an existin ...

  6. Macbook怎么强制关闭后台程序?Macbook强制关闭后台程序的方法

    有时候我们的Macbook电脑运行某个程序卡在那里耗了很长时间,程序本身有可能提供了取消按钮,点了也没有反应,这时候我们就很想强制关闭它了,那么Macbook怎么强制关闭后台运行的程序呢?下面完美小编 ...

  7. 说说ajax上传数据和接收数据

    我是一个脑袋不太灵光的人,所以遇到问题,厚着脸皮去请教大神的时候,害怕被大神鄙视,但是还是被鄙视了.我说自己不要点脸面,那是不可能的,但是,为了能让自己的技术生涯能走的更长远一些,受点白眼,受点嘲笑也 ...

  8. elememtui(有关权限的那些事)

    前言:关于权限路由的那些事儿…… 业务情景描述:现有一个后台管理系统,共存在三种类型的人员,①超级管理员(称作1):②组别管理员(2):③普通用户(3):每种类型的人看到的操作栏并不一样,可以进行的操 ...

  9. ZooKeeper数据结构

    Time in ZooKeeper ZooKeeper跟踪时间的多种方式 1)Zxid:每个ZooKeeper状态变化将会接收到一个zxid(ZooKeeper Transaction Id)的时间戳 ...

  10. SICP-1.5-控制结构

    测试 DOCSETS 在docstring中直接添加测试 def sum_naturals(n): """Return the sum of the first n na ...