python标准库之collections
<!doctype html>python标准库之collection
python标准库之collections
最近在工作零零散散的用到了一些collections的方法,突然有个想法来将它整理一下。
简介
collections是python中基础数据类型的容器模块,提供了更加便捷和快速的数据类型操作的方法,我们可以在合适的场景去运用他们。
常用方法
-
Counter()
统计序列中元素的个数:
作为输入,
Counter对象可以接受任意的由可哈希(hashable)元素构成的序列对象。 在底层实现上,一个Counter对象就是一个字典,将元素映射到它出现的次数上。xxxxxxxxxxfrom collections import Counterdef test_counter():text = "kshfkhdghskdnvknsighdsihinisdhguidhicoidsjiohfiuerhrfjsiohgi"words = Counter(text)print(words.items()) # 序列中各元素出现的次数print(words.most_common(3)) # 序列中出现次数最多的三个print(words["k"]) # 查看序列中某个元素出现的次数if __name__ == '__main__':test_counter()"""dict_items([('k', 4), ('s', 7), ('h', 10), ('f', 3), ('d', 6), ('g', 4), ('n', 3), ('v', 1), ('i', 11), ('u', 2), ('c', 1), ('o', 3), ('j', 2), ('e', 1), ('r', 2)])[('i', 11), ('h', 10), ('s', 7)]4""" -
defaultdict()
看了很多对defaultdict的解释没有一个能完美通俗的解释清楚的,那我们就简单从字面上去理解他吧,我觉得这样反倒更清晰。
定义一个默认格式的字典,他是dict的一个子类,那怎么定义一个默认格式的字典呢,请看下面的例子
xxxxxxxxxxfrom collections import defaultdictdef test_defaultdict():d = defaultdict(list) # 创建一个value默认为list类型的字典d["a"].append(1)d["a"].append(2)d["a"].append(3)print(d)print(d["a"])print(d["b"]) # 即使没有key("b"),取值也不会报错,依然会有默认值[]s = defaultdict(set) # 创建一个value默认为list类型的字典s["aa"].add(1)s["aa"].add(2)print(s["aa"],"__", s["bb"])if __name__ == '__main__':test_defaultdict()"""defaultdict(<class 'list'>, {'a': [1, 2, 3]})[1, 2, 3][]{1, 2} __ set()""" -
OrderDict()
OrderDict()字典排序,我们知道python的基本数据类型字典是无序的,但是我们想创建一个有序的字典怎么办呢?这个时候我们就可以用OrderDict()来创建,它会保留键值插入的顺序并以此顺序排列。
OrderDict内部维护着一个根据键值插入顺序的双向链表,每当一个新的元素被插入进来的时候,它会被放到链表的尾部。对于一个已存在的键值赋值不会改变键值的顺序。
需要注意的是OrderDict是一个普通字典大小的两倍,因为它内部维护着另外一个链表。使用时要注意这点。
xxxxxxxxxx>>> od = OrderedDict()>>> od['z'] = 1>>> od['y'] = 2>>> od['x'] = 3>>> od.keys() # 按照插入的Key的顺序返回['z', 'y', 'x'] -
namedtuple()
namedtuple()是一个方法生成的对象是tuple的子类,用来定义一个有指定含义的元组,通常我们定义一个元组无法知道他内部元素的含义,但是使用了namedtuple()就可以很清晰的知道这个元祖的的元素是用来干什么的
x
from collections import deque, namedtupledef test_namedtuple():Person = namedtuple("Person", ["name", "age", "gender"])person = Person("lily", 20, "female")print(person.age)print(person.name)print(person.gender)if __name__ == '__main__':test_namedtuple()"""20lilyfemale""" -
deque()
deque()可以创建一个队列容器,供我们消费,它与python的队列的区别在于deque()在增加元素的时候,超出设定元素个数大小时,会默认删除最早的那个;同时deque不像list是一个线性存储,deque是一个双向链表,数据量大的时候插入效率大大高于list
xfrom collections import dequedef test_deque():q1 = deque(maxlen=3)q1.append(1)q1.append(2)q1.append(3)q1。qppend(4)print(q1)if __name__ == '__main__':test_deque()# deque([2, 3, 4], maxlen=3)deque包含的方法:其中pop从队列的 尾部抛出数据,如果想从队列头部取数据则用popleft()


浙公网安备 33010602011771号