collections模块

内容概要

  • 具名元组(namedtuple)
  • 双端队列(deque)
  • 有序字典(OrderedDict)
  • 默认值字典(defaultdict)
  • 计数器(Counter)

内容详细

collections模块提供了一些高阶的数据类型

1、具名元组(namedtuple)

使用格式:

    from collections import namedtuple

    """
    namedtuple('名称',[名字1,名字2,...])
    namedtuple('名称','名字1 名字2 ...')
    """

写一个坐标数据:

# 二维
point = namedtuple('坐标', ['x', 'y'])
res = point(11, 22)
print(res)  # 坐标(x=11, y=22)
print(res.x)  # 11
print(res.y)  # 22

# 三维
point = namedtuple('坐标', 'x y z')
res = point(11, 22, 33)
print(res)  # 坐标(x=11, y=22, z=33)
print(res.x)  # 11
print(res.y)  # 22
print(res.z)  # 33

模拟扑克牌:

card = namedtuple('扑克', '花色 点数')
card1 = card('♠', 'A')
card2 = card('♥', 'K')
print(card1)
print(card1.花色)
print(card1.点数)

2、队列(queue)(非collections模块)

队列模块:queue

import queue  # 内置队列模块:FIFO
初始化队列
q = queue.Queue()
# 往队列中添加元素
q.put('first')
q.put('second')
q.put('third')
# 从队列中获取元素
print(q.get())
print(q.get())
print(q.get())
print(q.get())  # 值去没了就会原地等待

3、双端队列(deque)

支持的方法:

append(x):添加x到右端
appendleft(x):添加x到左端
clear():清楚所有元素,长度变为0
copy():创建一份浅拷贝
count(x):计算队列中个数等于x的元素
extend(iterable):在队列右侧添加iterable中的元素
extendleft(iterable):在队列左侧添加iterable中的元素,注:在左侧添加时,iterable参数的顺序将会反过来添加
index(x[,start[,stop]]):返回第 x 个元素(从 start 开始计算,在 stop 之前)。返回第一个匹配,如果没找到的话,升起 ValueError 。
insert(i,x):在位置 i 插入 x 。注:如果插入会导致一个限长deque超出长度 maxlen 的话,就升起一个 IndexError 。
pop():移除最右侧的元素
popleft():移除最左侧的元素
remove(value):移去找到的第一个 value。没有抛出ValueError
reverse():将deque逆序排列。返回 None 。
maxlen:队列的最大长度,没有限定则为None。

from collections import deque
q = deque([11,22,33])
q.append(44)  # 从右边添加
q.appendleft(55)  # 从左边添加
print(q.pop())  # 从右边取值
print(q.popleft())  # 从做边取值

4、有序字典(OrderedDict)

python中的字典其实是无序的,只不过在pycharm的编辑环境下,会给我们做优化,实际上,我们在python定义的字典有时是不会按输入顺序排列的

而OrderedDict是字典的子类,保留了数据添加的顺序

normal_dict = dict([('name', 'jason'), ('pwd', 123), ('hobby', 'study')])
print(normal_dict)  # {'hobby': 'study', 'pwd': 123, 'name': 'jason'}


from collections import OrderedDict
order_dict = OrderedDict([('name', 'jason'), ('pwd', 123), ('hobby', 'study')])
print(order_dict)  # OrderedDict([('name', 'jason'), ('pwd', 123), ('hobby', 'study')])

order_dict['xxx'] = 111
print(order_dict)  # OrderedDict([('name', 'jason'), ('pwd', 123), ('hobby', 'study'), ('xxx', 111)])
normal_dict['yyy'] = 222

print(normal_dict)  # {'hobby': 'study', 'pwd': 123, 'yyy': 222, 'name': 'jason'}

5、默认值字典(defaultdict)

from collections import defaultdict
values = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]
my_dict = defaultdict(list)
for value in  values:
    if value>60:
        my_dict['k1'].append(value)
    else:
        my_dict['k2'].append(value)
print(my_dict)

6、计数器(Counter)

Counter是一个dict子类,主要是用来对你访问的对象的频率进行计数。
常用方法:

elements():返回一个迭代器,每个元素重复计算的个数,如果一个元素的计数小于1,就会被忽略。
most_common([n]):返回一个列表,提供n个访问频率最高的元素和计数
subtract([iterable-or-mapping]):从迭代对象中减去元素,输入输出可以是0或者负数
update([iterable-or-mapping]):从迭代对象计数元素或者从另一个 映射对象 (或计数器) 添加。


res = 'abcdeabcdabcaba'
# 统计字符串中每个元素出现的次数

# 原先做法
new_dict = {}
for i in res:
     if i not in new_dict:
         new_dict[i] = 1
     else:
         new_dict[i] += 1
print(new_dict)



# 使用计数器:
from collections import Counter  # 计数器
ret = Counter(res)
print(ret)
posted @ 2021-11-25 19:13  elijah_li  阅读(3)  评论(0编辑  收藏  举报
//一下两个链接最好自己保存下来,再上传到自己的博客园的“文件”选项中