python模块:collections额外数据类型

python的collections模块扩展了几种数据类型
除了基本的str、list、tuple、set、dict、number等基本数据类型,collections又扩展了几种额外的数据类型

  • namedtuple(): 生成可以使用名字来访问元素内容的tuple子类
  • deque: 双端队列,可以快速的从另外一侧追加和推出对象
  • Counter: 计数器,主要用来计数
  • OrderedDict: 有序字典
  • defaultdict: 带有默认值的字典

namedtuple()

namedtuple主要用来产生可以使用名称来访问元素的数据对象,通常用来增强代码的可读性, 在访问一些tuple类型的数据时尤其好用。

from collections import namedtuple
example = [('baidu', 'www.baidu.com'),('goole', 'www.goole.com'),('163', 'www.163.com')]
Example = namedtuple(Example, ['name','url'])
for i in example:
	print(Example._make(i))

生成三个易读的元祖,操作用法跟之前的元祖一样

Example(name='baidu', url='www.baidu.com')
Example(name='goole', url='www.goole.com')
Example(name='163', url='www.163.com')

deque

deque其实是 double-ended queue 的缩写,翻译过来就是双端队列,它最大的好处就是实现了从队列 头部快速增加和取出对象: .popleft(), .appendleft() 。
list跟deque比较类似,但是list能用的语法deque都能实现
比如list的append、count、extend、index、insert、pop、remove、reverse、sort等用法在deque中都能实现
但是deque作为双向队列,有一些新的用法是list不能实现的
比如appendleft、extendleft、popleft、rotate(旋转)、maxlen(最大空间,无边界返回None)
而deque双向队列的rotate(n=1),意思是将序列末尾的最后1个元素移动到前面,同事可以在生成队列是指定最大空间,比如deque(‘abcd’,8),这个队列最多存储8个元素

from collections import deque

b=deque("ABCDEFG")
print(b)
b.rotate(2)
print(b)
b.rotate(3)
print(b)

输出结果为:

deque(['A', 'B', 'C', 'D', 'E', 'F', 'G'])
deque(['F', 'G', 'A', 'B', 'C', 'D', 'E'])
deque(['C', 'D', 'E', 'F', 'G', 'A', 'B'])

deque的用法跟list一样,只是是双向队列,相对于列表他的时间复杂度更低

Counter

计数器是一个非常常用的功能需求,collections也贴心的为你提供了这个功能

from collections import Counter

s = '''A Counter is a dict subclass for counting hashable objects. It is an unordered collection where elements are stored as dictionary keys and their counts are stored as dictionary values. Counts are allowed to be any integer value including zero or negative counts. The Counter class is similar to bags or multisets in other languages.'''.lower()

c = Counter(s)
# 获取出现频率最高的5个字符
print c.most_common(5)

# Result:
[(' ', 54), ('e', 32), ('s', 25), ('a', 24), ('t', 24)]

新生成的Coutnter对象是一个字典,它的用法跟字典一样
但是他还用有elements、most_common、subtract用法
elements()是将他的值乘于键数给打印出来
most_common(n),是将统计次数最多的前n个给返回
subtract(n)将counter对象做减法

OrderedDict

在Python中,dict这个数据结构由于hash的特性,是无序的,有时候会带来一些麻烦,但是通过OrderedDict可以变成有序的字典

from collections import OrderedDict

items = (
    ('A', 1),
    ('B', 2),
    ('C', 3)
)

regular_dict = dict(items)
ordered_dict = OrderedDict(items)

print 'Regular Dict:'
for k, v in regular_dict.items():
    print k, v

print 'Ordered Dict:'
for k, v in ordered_dict.items():
    print k, v

# Result:
Regular Dict:
A 1
C 3
B 2
Ordered Dict:
A 1
B 2
C 3

但是从python3.7之后,字典都变的有序了,改进了字典,减少了内存,运行效率从以前的O(1) 变为O(2),但是却让字典有序跟减少了内存。

defaultdict

我们都知道,在使用Python原生的数据结构dict的时候,如果用 d[key] 这样的方式访问, 当指定的key不存在时,是会抛出KeyError异常的。

但是,如果使用defaultdict,只要你传入一个默认的工厂方法,那么请求一个不存在的key时, 便会调用这个工厂方法使用其结果来作为这个key的默认值

from collections import defaultdict

dic1 = defaultdict(int)
print(dic1['a'])

dic2 = defaultdict(list)
print(dic2['a'])

dic3 = defaultdict(dict)
print(dic3['a'])

#result
0
[]
{}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值