collections提供了一些容器类,用来替代list,set,tuple,dict的标准容器
类名 | 用途 |
---|
namedtuple | 创建命名元祖子类的工厂函数 | deque | 类似列表,实现了从两端快速添加和弹出 | ChainMap | 类似字典,将多个映射集合到一个视图里 | Counter | 类似字典,提供了可哈希对象的计数功能 | OrderedDict | 字典的子类,保存了被添加的顺序 | defaultdict | 字典的子类,提供了一个工厂函数,为字典查询提供一个默认值 | UserDict | 封装了字典对象,简化了字典子类化 | UserList | 封装了列表对象,简化了列表子类化 | UserString | 封装了字符串对象,简化了字符串子类化 |
deque
deque是一个双向队列,创建队列时,如果指定maxlen,则创建固定长度的队列,当有新纪录加入队列而队列已满时会自动移除最老的那条记录 可以从两端添加和弹出元素 append(x)------添加到右端 appendleft(x)------添加到左端 pop()----移除最右侧的元素 popleft()-----移除最左侧的元素
from collections import deque
de=deque(maxlen=3)
de.append(2)
de.append(3)
de.append(4)
print(list(de))
de.append(5)
print(list(de))
print(de[2])
运行结果:
[2, 3, 4]
[3, 4, 5]
5
deque应用场景,保存最后N个元素
import re
from collections import deque
"""
对一系列的文本做简单的匹配操作,如果匹配则返回匹配的行以及检查过的前N行
分析:首先肯定要使用一个变量记录匹配的行,一个列表记录检查过的前N行(使用deque可以很方便的记录前N行)
一个文件中如果有多个匹配的行,如何记录这些匹配的行以及每一个匹配行的前N行,使用列表,元素是元组
"""
def search_deque(flines,pattern,history=5):
result=list()
previoue_lines=deque(maxlen=history)
for line in flines:
previoue_lines.append(line)
if re.search(pattern,line):
result.append((line,list(previoue_lines)))
return result
with open("test","r") as f:
for line,pline in search_deque(f,"python"):
for item in pline:
print(item,end=",")
print(line)
print("-"*20)
使用生成器将代码优化
def serch_deque_gen(flines,pattern,history=5):
previous_line=deque(maxlen=history)
for line in flines:
if re.search(pattern,line):
yield line,previous_line
previous_line.append(line)
with open("test","r") as f:
for line,pline in serch_deque_gen(f,"python"):
for item in pline:
print(item,end=",")
print(line)
print("-"*20)
defaultdict
defaultdict(default_factory=None)
default_factory: 如果创建对象时传入default_factory,那字典会被初始化为default_factory
from collections import defaultdict
dic1=defaultdict()
dic2=defaultdict(list)
dic3=defaultdict(int)
print(dic1)
print(dic2)
print(dic3)
使用list作为default_factory,可以创建一个键-列表组成的字典 使用defaultdict的好处是:会自动初始化第一个值,这样后续可以直接使用+,append等方法
dic4=dict()
dic4["one"].append(4)
运行结果:
KeyError: 'one'
可以使用setdefault设置一个初始值
dic4=dict()
dic4.setdefault('one',[])
dic4["one"].append(4)
print(dic4)
from collections import defaultdict
dic1=defaultdict(int)
dic1["one"]+=1
print(dic1)
OrderDict
创建有序字典
Counter
提供快速和方便计数,用于计数可哈希对象 class collections.Counter([iterable-or-mapping])
from collections import Counter
c=Counter("werrieuuuueeewssdee")
print(c)
运行结果:
Counter({'e': 7, 'u': 4, 'w': 2, 'r': 2, 's': 2, 'i': 1, 'd': 1})
c1=Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])
print(c1)
运行结果:
Counter({'blue': 3, 'red': 2, 'green': 1})
使用dict将Counter转化为普通字典
c1=Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])
print(dict(c1))
运行结果:
{'red': 2, 'blue': 3, 'green': 1}
most_common
返回一个列表,出现次数最多的前n个元素
words=["look","into","my","eyes","look","iinto","my","eyes","the","eyes","the","eyes","not","around","under","into"]
word_counts=Counter(words)
lst=word_counts.most_common(3)
print(lst)
运行结果:
[('eyes', 4), ('look', 2), ('into', 2)]
|