前言
学习
Python
的同学应该都知道
Python
中的复合数据类型有
tuple
、
dict
、
list
、
set
等,但这些数据类型本身是有局限的,比如最典型的
dict
,其中的
key
是无序的,有时候我们想要根据其
key
排序时,就必须自己手动写一个函数或是一段代码来处理,然而实际上,在
Python
中,对于这类问题已经提供了很好的解决方案,并不需要我们再动手创建一个轮子,这就是我们这一篇要介绍的
Python
基本库
collections
。
极简类的另类实现
比如我们有时候想记录一些人的姓名、年龄和性别,这时候当然最好是创建一个类了,但是如果利用
collections
中的一个扩展类
namedtuple
,则实现这个功能很简单:
from collections import namedtupleperson = namedtuple('person', ['name', 'age', 'gender'])
这样就创建好了有些象一个类的扩展元组,下面我们就可以用这个
person
来记录人员信息了:
p1 = person(name="张三", age=10, gender="男")p1>>> 输出:person(name='张三', age=10, gender='男')
这样子看起来是不是很象类?甚至对于创建的
p1
变量而言,我们依然可以将其当成一个类对象来使用,比如访问
p1
这个人的年龄,可以这样访问:
p1.age>>> 输出:10
namedtuple
的更大功能在于处理数据库对象,当将读取的数据记录当做一个
namedtuple
时,它的访问就显得更加直观,而且代码就显得可读性更好,也更容易维护。
分类汇总功能的实现
我们在用
Excel
表格进行统计时,常常会用到它的分类汇总功能,这个功能很强大,它可以依据某一列进行扩展汇总,这在一些特定的场合显得相当有用,在
collections
中,有一个
Counter
类,它也同样有类似强大的功能,下面我们给出一些代码展示:
from collections import Counterages = [22,22,23,23,5,5,5,22,9,9,9,9,80,80,81]value_counts = Counter(ages)value_counts.most_common()>>> 输出:[(9, 4), (22, 3), (5, 3), (23, 2), (80, 2), (81, 1)]
从上述代码的输出可以看出,
Counter
对象的
most_common
方法将原列表
age
中的数据进行了分类汇总,统计出了每个数字出现的次数,并按照出现次数从多到少的顺序进行了排列。
这个功能我自己经常在用,因为要经常对某些产品表格中的物品进行汇总,用这个方式可以一下子数出每种产品的数量,这在做汇总表时特别有用。
带默认值的字典
使用
dict
时,如果关键字
key
不存在,则解释器会抛出异常,如果希望
key
不存在时,返回一个默认值,就可以用
collections
中的
defaultdict
:
from collections import defaultdictd1 = defaultdict(lambda: "关键字不存在")d1['a']>>> 输出:'关键字不存在'
当然,
defaultdict
还有另一个强大的功能是在设定初始化后,它可以在第一次遇到一个关键字时将其值填充为默认值,比如:
d2 = defaultdict(int)for letter in "I love you and you love me!": d2[letter] += 1d2
![0bd78fd4b755d67d7f051139194ac292.png](https://i-blog.csdnimg.cn/blog_migrate/b6de6f8ac09523804404ea955001b289.png)
从上述输出可以看出,这样就简单地将每个字符出现的次数统计出来了,如果用原来的
dict
,则它是这样的:
d2 = dict()for letter in "I love you and you love me!": d2[letter] = d2.get(letter,0) + 1d2
![d6b65d29fe0d5951eb4305f2c2cef43c.png](https://i-blog.csdnimg.cn/blog_migrate/ae276745259c814956b5b0622955d3c5.png)
尽管后者看起来也不麻烦,但相对而言,前者更简洁一些。
双向列表
我们知道
list
可以通过
append
方法在其后进行追加,也可以通过
insert
在其某个位置插入,当然也可通过
remove
方法进行删除,但当数据量比较大的时候,用这种插入和删除方法就会变得很慢,这是由于
list
是线性存储的关系,在
collections
中有一个
deque
可以对列表实现高效插入和删除,事实上用该关键字创建的就是一个双向列表,这种方法通常应用于队列和栈操作,比如:
from collections import dequea1 = deque(['a', 'b', 'c'])## 尾部插入a1.append('d')## 头部插入a1.appendleft('e')a1>>> 输出:deque(['e', 'a', 'b', 'c', 'd'])
删除尾部数据和头部数据的方法如下:
## 删除最右边的数据a1.pop()## 删除最左边的数据a1.popleft()a1>>> 输出:deque(['a', 'b', 'c'])
有序字典
在前言中说过
dict
创建的字典是无序的(
但在python3.8的环境中测试似乎有序,请同学们验证),为了解决这个问题,我之前用的方法是将
dict
的所有
key
组成一个列表进行排序,之后用循环的方式来将访问对应的键值,在
collections
中提供了一个
OrderedDict
类,用它创建的字典会按照创建元素插入的顺序进行排列,这就显得很方便,即按我们想要的字典创建好以后,就可以直接使用,不必担心无序的问题:
from collections import OrderedDictd4 = OrderedDict()d4['a'] = 3d4['b'] = 4d4['c'] = 5d4['d'] = 6d4>>> 输出:OrderedDict([('a', 3), ('b', 4), ('c', 5), ('d', 6)])
小结
在新的
Python
版本中,关于
collections
还有几个新增的类,同学们可以在官网查询该标准库的使用。利用这个库的类,有助于我们在读取
Excel
数据或数据库数据时进行更方便有效的处理。