python-collections

python-collections,第1张

collections提供了一些容器类,用来替代list,set,tuple,dict的标准容器

类名用途
namedtuple创建命名元祖子类的工厂函数
deque类似列表,实现了从两端快速添加和d出
ChainMap类似字典,将多个映射集合到一个视图里
Counter类似字典,提供了可哈希对象的计数功能
OrderedDict字典的子类,保存了被添加的顺序
defaultdict字典的子类,提供了一个工厂函数,为字典查询提供一个默认值
UserDict封装了字典对象,简化了字典子类化
UserList封装了列表对象,简化了列表子类化
UserString封装了字符串对象,简化了字符串子类化
deque

deque是一个双向队列,创建队列时,如果指定maxlen,则创建固定长度的队列,当有新纪录加入队列而队列已满时会自动移除最老的那条记录
可以从两端添加和d出元素
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))
#队列已满,再次添加,会将2移除队列
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):
        #注意:这里要使用list将deque转化为list,否则,这里将添加的是deque对象,后续后的值也会改变
            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()
#因为列表没有被初始化,就直接使用append会报错
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)]

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/756615.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-30
下一篇 2022-04-30

发表评论

登录后才能评论

评论列表(0条)

保存