Python标准库collections模块
Python中最常用的几种数据结构是list、tuple、dict、 set,但是当我们处理一些特定数据结构场景时就显得有些不方便或者效率低,不过Python丰富的类库已经帮我们解决了这个问题,今天要提到的就是collections库,该库里包含了许多非常有用的集合方法,熟练掌握这些方法可以让我们平时写代码时更加Pythonic而不是绞尽脑汁把简单的代码复杂化。
先来看看几个非常有用的collections库里的方法。
defaultdict()
defaultdict()方法其实有点类似于字典自带的setdefault()方法,setdefault()是在访问字典键是否存在的时候设定默认值。而defaultdict()方法则是先前设定好字典的缺失状态下的默认值,而这个传入参数是一个函数方法。
# 用form...import...方式导入,因为defaultdict方法属于collections类库。
from collections import defaultdict
test = defaultdict(int)
test["name"] = "anders"
print(test["age"])
# 输出如下:
# 0
在上面这个例子中,把函数int作为参数传入,会按照int()调用,返回整数0。
因为,我们之前提到defaultdict的传入参数其实是一个方法函数,它返回赋给缺失键的值。那么下面我们自定义一个函数方法作为参数传入来看看不一样的效果。
from collections import defaultdict
def no_value():
return 'No Value!'
test = defaultdict(no_value)
test["name"] = "anders"
print(test["age"])
# 输出如下:
# No Value!
上面这个例子中,我们定义了一个简单的函数方法,一旦调用该方法就会返回"No Value!",于是我们把这个函数方法当做参数传给defaultdict()方法,这样就设定了test字典键的默认值就是先前传入的函数方法的返回值,也就是"No Value!"。
既然参数是一个函数方法,那么当然我们也可以传入lambda表达式。
from collections import defaultdict
test = defaultdict(lambda: "No Value!")
test['name']
# 输出如下:
# No Value!
Counter()
Counter()是一个计数器,用来统计相关元素出现的个数。
from collections import Counter
test = ['a', 'b', 'c', 'a', 'a', 'b']
count = Counter(test)
print(count)
# 输出如下:
# Counter({'a': 3, 'b': 2, 'c': 1})
还可以使用most_common()方法来以降序的方式返回一个元组列表。
from collections import Counter
test = ['a', 'b', 'c', 'a', 'a', 'b']
count = Counter(test)
print(count.most_common())
# 输出如下:
# [('a', 3), ('b', 2), ('c', 1)]
因为是以降序的方式排序,所以我们还可以给他传参,参数值为要返回的个数的数字,在下面例子中,假设我们输入1,它就显示当前的第一个元素值,也就列出了当前个数最多的统计数。
from collections import Counter
test = ['a', 'b', 'c', 'a', 'a', 'b']
count = Counter(test)
print(count.most_common(1))
# 输出如下:
# [('a', 3)]
OrderedDict()
我们都知道每次在输出字典中键的顺序都是无序不可知的,但是如果我们使用OrderedDict()方法可以使字典变成有序字典,也就是可以记忆我们插入的元素顺序,然后从一个迭代器操作时可以以相同的顺序返回。
from collections import OrderedDict
test = OrderedDict({"Anders":3, "Mary": 2, "Tom":1})
for k, v in test.items():
print(k, v)
# 输出如下:
# Anders 3
# Mary 2
# Tom 1
也就是说,你是如何在OrderedDict里定义的,它就记住了这个顺序当你下次遍历的时候依然保持这个顺序。