collections模块

collections模块

collections模块是数据类型的扩展模块,一些非常重要但平常又不经常使用的数据类型都放在该模块

(一)、单端队列

单端队列的特点:

  • 先进先出:一边进另一边出,必须严格按照顺序进行
    • 导入模块:import queue
    • 实例化单端队列对象:q = queue.Queue()
    • 往队列中放入值:q.put(值)
    • 查看当前队列的大小:print(q.qsize())
    • 获取最先放进去的值:print(q.get())
import queue
q = queue.Queue()
q.put(1)
# put()放入值
print('大小%s' % q.qsize())
q.put('a')
print('大小%s' % q.qsize())
q.put((1,2,3))
print('大小%s' % q.qsize())
q.put({'k1': 'k2'})
print('大小%s' % q.qsize())
print(q)
# <Queue.Queue instance at 0x10b13c098>
print(q.get())
# 获取到的是最先放进去的值:1

'''
结果是:
大小1
大小2
大小3
大小4
<Queue.Queue instance at 0x101f8e0e0>
1

'''

  • 队列外部是看不到内部的排列顺序的,单端队列非常的严格。

(二)、双端队列(deque)

  • 双端队列两端都是可以进,也可以出,基于这样一个原理,越是先进去的越在双端队列的中间,出去的越晚。
  • deque对象的基本操作:
    • 导入模块:from collections import deque
    • 创建双端队列对象:dq = deque()
    • 给队列加值:append()右侧添加, appendleft()左侧添加, insert()往指定的位置加值
    • 删除队列中的值:pop()删除末尾的值,popleft()删除左边的值,remove()删除指定的值
  • deque对象格式是一个类似于列表类型,拥有列表的删除、增加的功能,但是两者之间存在区别:
    • 在insert、remove的时候,deque的平均效率要远远高于列表。
    • 列表在根据索引查看某个值的速度要高于deque
    • append和pop对于对于列表的速度和效率没有什么影响,如果从开头或者中间去操作,效率影响会很大,所以,实际的工作中列表操作很少会用到insert()和remove()。
from collections import deque
dq = deque()
# 创建双端队列对象
dq.append(1)
dq.append({'k1':'k2'})
# 往队列中添加数据
dq.append(23456)
dq.appendleft('123245')
dq.appendleft((1,2,3,4,5))
print(dq)
# 输出的数据为列表形式 
dq.pop()
print(dq)
dq.pop()
print(dq)
dq.remove('123245')
print(dq)
dq.popleft()
print(dq)
dq.insert(1, 1)
print(dq)

'''
deque([(1, 2, 3, 4, 5), '123245', 1, {'k1': 'k2'}, 23456])
deque([(1, 2, 3, 4, 5), '123245', 1, {'k1': 'k2'}])
deque([(1, 2, 3, 4, 5), '123245', 1])
deque([(1, 2, 3, 4, 5), 1])
deque([1])
deque([1, 1])
'''

(三)、创建新的数据类型:namedtuple

namedtuple创建新的数据类型,基本的步骤为:

  • 导入包:from collections import namedtuple
  • 创建新的类:类名 = namedtuple('对类的描述', [类的参数1, 类的参数2,...])
  • 实例化类,创建类对象
  • 通过对象.属性调用数据,因为是元组类型,也可以通过下标索引来调用
from collections import namedtuple
Rectagle = namedtuple('Ractangle_class', ['length', 'width'])
# 类名 = namedtuple('对类的描述', [类的参数名1, 参数名2...])
# 这个类实际上相当于创建了一个新的数据类型
r = Rectagle(100, 50)
# 实例化类           
print(r.length)
print(r.width)
# 实例化对象是一个元组,可以通过属性来访问
print(r)
print(r[1])
print(r[0])
# 也可以通过下标索引来访问

'''
100
50
Ractangle_class(length=100, width=50)
50
100

'''

(四)、defaultdict

正常的字典,当调用一个字典中没有的key时程序会报错,但是当通过defaultdict创建的字典如果调用没有字典中没有的key的时候不会报错,会返回一个默认值。
具体步骤:

  • 导入包:from collections import defaultdict
  • 创建字典: d = defaultdict(工厂, k1='v1', k2='v2',...),这里的参数不能加引号
  • 调用字典:d['k1'], d['k2'], d['k3']...
  • 当调用到字典中不存在的key时,会返回工厂的默认返回值,并且把默认值和查询的key作为key、value添加到字典中去。
  • 工厂的类型:
    • python已经定义好的数据类型
    • 自定义函数,函数不能有参数,直接时return 返回值
'''python定义好的数据类型'''
from collections import defaultdict
d = defaultdict(int, name='alex', age=19)
print(d['name'])
print(d['age'])
print(d['gender'])

'''
alex
19
0
'''
'''自定义函数作为工厂'''
from collections import defaultdict

def func():
    return 'dict'
    # 函数不能有参数

d = defaultdict(func, name='alex', age=100)
print(d['name'])
print(d['age'])
print(d['gender'])

'''
alex
100
dict
'''

(五)、计数器Counter

通过计数器可以获取对象中每一个元素出现的次数,并以字典的格式来返回, key为元素, value为该元素出现的次数。
具体用法:

  • 导入包:from collections import Counter
  • 创建计数器对象:c = Counter(需要被计数对象)
  • 计数器对象是一个由参数和出现次数作为key、value的字典对象
  • 查看出现次数最多的几个参数:c.most_common(num), num表示要查看的前几个参数
  • 删除字典对象的最后一位:c.popitem()
from collections import Counter

c = Counter([1,2,3,4,5,634,23,44,2,4,25,2,52,6,2,3,2,4,2,4,6,7])
print(c.most_common(4))
print(c)
print(c.popitem())
print(c)

'''
[(2, 6), (4, 4), (3, 2), (6, 2)]
Counter({2: 6, 4: 4, 3: 2, 6: 2, 1: 1, 5: 1, 634: 1, 23: 1, 44: 1, 25: 1, 52: 1, 7: 1})
(7, 1)
Counter({2: 6, 4: 4, 3: 2, 6: 2, 1: 1, 5: 1, 634: 1, 23: 1, 44: 1, 25: 1, 52: 1})
'''

注意:放入计数器中的对象必须是可哈希的,即可以迭代的对象

posted @ 2020-02-16 17:35  大道至诚  阅读(149)  评论(0编辑  收藏  举报