集合的嵌套结果映射并分页_Python成为专业人士笔记–Collections集合模块剖析

e42b00573b13d3d875ae09f5a8fc6501.png

“专业人士笔记”系列目录:

创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com
b817bdb2514bae3ba5bb089087449c6c.png

简述

内置的Collections集合包提供了几种专门的、灵活的集合类型,它们提供了dict、list、tuple和set等一般集合类型的更高性能的替代方案。模块还定义了抽象基类,这些抽象基类描述了不同类型的集合功能(如MutableSet和ItemsView)。

计数

Counter是一个dict子类,它允许你轻松地对对象进行计数

import collections
counts = collections.Counter([1,2,2,3])
print(counts)

# Counter({2: 2, 1: 1, 3: 1})  输出字典,其中2出现了2次

一些更详细的用法:

单词计数:

import collections
collections.Counter('Happy Birthday')

#Counter({'a': 2, 'p': 2, 'y': 2, 'i': 1, 'r': 1, 'B': 1, ' ': 1, 'H': 1, 'd': 1, 'h': 1, 't': 1})

词语计数:

import collections
collections.Counter('I am Sam Sam I am That Sam-I-am That Sam-I-am! I do not like that Sam-I-am'.split())

#注意:上面使用split函数,将字符串按空格拆分成列表后,将列表作为参数传入则是词语计数
#Counter({'I': 3, 'Sam': 2, 'Sam-I-am': 2, 'That': 2, 'am': 2, 'do': 1, 'Sam-I-am!': 1, 'that': 1,
 'not': 1, 'like': 1})

顺序集合

在Python字典类型中,键的顺序是任意的:它们不受您添加它们的顺序的控制

collections.OrderedDict 提供保留键顺序的dictionary对象。OrderedDicts可以创建如下所示的一系列有序项(下面是集合列表) :

from collections import OrderedDict
d = OrderedDict([('foo', 5), ('bar', 6)])
print(d)

#OrderedDict([('foo', 5), ('bar', 6)])

d['baz'] = 7
print(d)
#OrderedDict([('foo', 5), ('bar', 6), ('baz', 7)])

d['cc'] = 3
print(d)
#OrderedDict([('foo', 5), ('bar', 6), ('baz', 7), ('cc', 3)])

发现了吗,上面集合列表中的字典顺序,是按照你添加值的顺序排列的

所以,我们也可以完全先创建一个空的顺序集合,再一点一点添加值:

from collections import OrderedDict
o = OrderedDict()

o['key1'] = "value1"
o['key2'] = "value2"

print(o)

#输出:OrderedDict([('key1', 'value1'), ('key2', 'value2')])

默认字典

defaultdict返回dict的一个子类,该子类为不存在的键提供一个默认值。参数应该是一个类,参数调用时返回这种类默认值。如果没有传递任何内容,则默认为None

import collections
state_capitals = collections.defaultdict(int)  #传递了int类,其默认值是0
print(state_capitals)

#输出:defaultdict(<class 'int'>, {})

上面的代码返回了对defaultdict的引用,该引用将使用其默认值方法创建一个默认值为0的字典

import collections
state_capitals = collections.defaultdict(int)  #传递了int类,其默认值是0


print(state_capitals['a'])  #访问了一个不存在的字典键

#未报错,输出0
#如果前面不使用defaultdict,则这个字典访问不存在的键会报keyerror错误

命名元组

像这样使用namedtuple定义一个新的类型Person :

from collections import namedtuple
Person = namedtuple('Person', ['age', 'height', 'name'])

第二个参数是元组将拥有的属性列表。您也可以将这些属性作为空格或逗号分隔的字符串列出 :

from collections import namedtuple

#下面几种方式定义都可以

Person = namedtuple('Person', ['age', 'height', 'name'])

Person = namedtuple('Person', 'age, height, name')

Person = namedtuple('Person', 'age height name')

一旦定义,命名元组就可以通过使用必要的参数调用对象来实例化 :

from collections import namedtuple

#三种定义方式
Person = namedtuple('Person', ['age', 'height', 'name'])

Person = namedtuple('Person', 'age, height, name')

Person = namedtuple('Person', 'age height name')


#两种初始化方式
dave = Person(30, 178, 'Dave')
jack = Person(age=30, height=178, name='Jack S.')

print(jack.age)

# 30
print(jack.name)

# 'Jack S.'

双端队列

Deques是堆栈和队列的泛化(名称发音类似“deck”,是双端队列的缩写)。deque支持在内存中有效的从deque任何一边附加值和弹出值, 并保障了线程安全性

其 在任何方向上都具有大致相同的O(1)性能。虽然list对象支持类似的操作,但list对于pop(0)和insert(0,v)操作会产生O(n)的内存移动成本

如果未指定maxlen或maxlen为None, deques可能会增长到任意长度。否则,deque被限制到指定的最大长度。一旦一个有限长度的deque满了,当添加新项时,会从另一端丢弃相应数量的项。有限长度的deque提供了类似于Unix中的尾部过滤器的功能。它们还可以用于跟踪事务和只有最近的活动才感兴趣数据池

from collections import deque

#创建双端队列
d = deque('ghi')
for elem in d:
    print(elem.upper())

#增加元素
d.append('j')
d.appendleft('f')
print(d)

#删除元素
d.pop()
d.popleft()
print(d)

#旋转队列
d.rotate(-1)
print(d)

链映射

其返回一个新的链映射对象,该对象具有多个映射。该对象将多个dict或其他映射分组在一起,以创建单个的、可更新的视图。链映射是管理嵌套上下文和覆盖的有用工具。

python世界中的一个例子是在Django的模板引擎中实现上下文类。它对于快速链接多个映射非常有用,因此可以将结果作为单个单元处理。它通常比创建新字典和运行多个update()调用快得多。

任何时候,只要需要一个快速查找值的链,而且链中可能有重复键且需要都保留的时候,就可以使用ChainMap

import collections

#  定义至少有一些键重叠的两个字典 
dict1 = {'apple': 1, 'banana': 2}
dict2 = {'coconut': 1, 'date': 1, 'apple': 3}

#  创建两个链映射,这些字典的顺序不同 
combined_dict = collections.ChainMap(dict1, dict2)
reverse_ordered_dict = collections.ChainMap(dict2, dict1)

#打印链
print(combined_dict)  
# ChainMap({'apple': 1, 'banana': 2}, {'coconut': 1, 'date': 1, 'apple': 3})

print(reverse_ordered_dict)
# ChainMap({'coconut': 1, 'date': 1, 'apple': 3}, {'apple': 1, 'banana': 2})

#遍历链
for k, v in combined_dict.items():

    print(k, v)

for k, v in reverse_ordered_dict.items():

    print(k, v)

以上代码均已通过python3云环境调试成功,请勿转载,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值