python标准库之collections
<!doctype html>python标准库之collection
python标准库之collections
最近在工作零零散散的用到了一些collections的方法,突然有个想法来将它整理一下。
简介
collections是python中基础数据类型的容器模块,提供了更加便捷和快速的数据类型操作的方法,我们可以在合适的场景去运用他们。
常用方法
-
Counter()
统计序列中元素的个数:
作为输入,
Counter
对象可以接受任意的由可哈希(hashable
)元素构成的序列对象。 在底层实现上,一个Counter
对象就是一个字典,将元素映射到它出现的次数上。xxxxxxxxxx
from collections import Counter
def 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的一个子类,那怎么定义一个默认格式的字典呢,请看下面的例子
xxxxxxxxxx
from collections import defaultdict
def 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, namedtuple
def 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()
"""
20
lily
female
"""
-
deque()
deque()可以创建一个队列容器,供我们消费,它与python的队列的区别在于deque()在增加元素的时候,超出设定元素个数大小时,会默认删除最早的那个;同时deque不像list是一个线性存储,deque是一个双向链表,数据量大的时候插入效率大大高于list
xfrom collections import deque
def 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()