利用Python collections 库使任务处理更为简便

collections是Python标准库,其中很多类都能能使我们代码更为简洁,处理更为方便。

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

namedtuple()

可以使用名称来访问 tuple 中的数据对象。假设我们要表示空间中的一个点 p(1, 2, 3),并且想以 p.x p.y p.z 的形式访问其中数据,单独建一个类可以,但没必要,这就可以用 namedtuple() 来做了

输入:

from collections import namedtuple

point = namedtuple('point', ['x', 'y', 'z'])
p = point(1, 2, 3)

print(p.x, p.y, p.z)

输出:
1 2 3

deque()

deque 是双头队列,它最大的好处就是实现了从队列头部快速增加和取出对象: appendleft() , popleft(),。

你可能会说,原生的list也可以从头部添加和取出对象啊?就像这样:
l.insert(0, v)
l.pop(0)
但是值得注意的是,list对象的这两种用法的时间复杂度是 O(n) ,也就是说随着元素数量的增加耗时呈线性上升。而使用deque对象则是 O(1) 的复杂度,所以当你的代码有这样的需求的时候,一定要记得使用deque。

作为一个双端队列,deque还提供了一些其他的好用方法,比如 rotate 等。

from collections import deque

q=deque(['b', 'c'])
q.popleft()
q.appendleft('a')

print(q)

输出:
deque(['a', 'c'])

defaultdict()

使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用 defaultdict:

from collections import defaultdict

# 两种常见的用途
# 字典a,如果要查找的数据不存在,则返回预先设定的值
a=defaultdict(lambda:'N/A')  
a[1]='a'

print(a[1]+'\n'+a[2])

输出:
a
N/A

# 字典b,想要统计一组数据中各个类别的个数时常用
b=defaultdict(int) # 如果想查找的 key 不在字典中,则返回0
test=['a','a','b','c','c','d']  # 统计每个字母出现的个数
for x in test:
    b[x] += 1
print(b)

输出:
defaultdict(<class 'int'>, {'a': 2, 'b': 1, 'c': 2, 'd': 1})

OrderedDict()

使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。

如果要保持Key的顺序,可以用OrderedDict:

from collections import OrderedDict

d = dict([('a', 1), ('b', 2), ('c', 3)])
print(d) # dict的Key是无序的

输出:
{'a': 1, 'c': 3, 'b': 2}

od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od) # OrderedDict的Key是有序的

输出:
OrderedDict([('a', 1), ('b', 2), ('c', 3)])

注 意 : \color{red}{注意:} OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:

od = OrderedDict()
od['z'] = 1
od['y'] = 2
od['x'] = 3
od.keys() # 按照插入的Key的顺序返回

输出:
['z', 'y', 'x']

Counter()

Counter是一个简单的计数器,例如,统计字符出现的个数:

from collections import Counter
c = Counter()
for ch in 'aabccda':
     c[ch]  += 1
print(c)

输出:
Counter({'a': 3, 'b': 1, 'c': 2, 'd': 1})

或是:

from collections import Counter
a='aabbcdd'
c=Counter(a)

c.most_common()

输出:
[('a', 2), ('b', 2), ('d', 2), ('c', 1)]

most_common() 是 counter() 下的一个方法,用元组的形式显示数据项及其出现次数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Systemd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值