先来看一下collections模块中的方法:python
__all__ = ['deque', 'defaultdict', 'namedtuple', 'UserDict', 'UserList', 'UserString', 'Counter', 'OrderedDict', 'ChainMap']
本章咱们只介绍除UserDict/UserList/UserString之外的方法,至于这三个方法,咱们用于继承他们,而实现你想要的结构。
namedtuple:用于建立具备命名字段的tuple子类的工厂函数数组
#好比咱们想构造一个纸牌类 Card=namedtuple('Card',[rank,suit]) #等同于namedtuple('Card',(rank,suit)) c1=Card('A','红桃') c2=Card('K','黑桃') print(c1.rank) #A print(c1.suit) #红桃 print(c1.rank) #B print(c1.suit) #黑桃 #改变对象的属性,能够使用 对象._replace(属性=值)方法更改已建立的对象的值 #_replace能够传入一个dict
deque:list-like容器,两端都有快速追加和弹出类,用于建立多个映射的单个视图(线程安全)安全
#其内部是一个单字母数组 a=deque("str") a.appendleft("a") #在头部插入数据 a.append("b") #在尾部插入数据 a.count("a") #查看字符出现的次数 a.insert(2,"y") #根据索引插入值 a.clear() #清空双端队列
defaultdict:多值字典app
dict1=defaultdict(list/dict/set/lambda :"None") dict1['a'].add(1) #以set为例 print(dict1) #defaultdict(<class 'set'>, {'a': {1}}) print(dict1['b']) #None,这就是lambda的做用
OrderedDict:保持元素被插入的顺序,结构是一个双向链表函数
#python3下dict默认也是有序的,可是方法有限 od=OrderedDict([("name","jim"),("age",19),("sex","男")]) od.setdefault("high",178) #添加一组数据,或者使用od["high"]=178 od.move_to_end('name') #将name组放置末尾 for i in od.items(): print(i) #('name', 'jim') #('age', 19) #('sex', '男') #('high', 178)
Counter:计数器,在底层中为一个字典ui
c=Counter() #能够直接Counter("测shishiyong"),这样就不用循环 for i in "测shishiyong": c[i]=c[i]+1 print(c) #Counter({'s': 2, 'h': 2, 'i': 2, '测': 1, 'y': 1, 'o': 1, 'n': 1, 'g': 1}) print(c.most_common(3)) #出现次数最多的三个元素 #[('s', 2), ('h', 2), ('i', 2)] #c['元素'] 查看元素的出现次数 #c.update(list/str) 能够增长元素 #Counter能够使用+/-进行运算
ChainMap:合并多个字典线程
dict1={'name':'jim','age':21} dict2={'high':175,'gender':'男'} new_dict=ChainMap(dict1,dict2) print(new_dict) #ChainMap({'name': 'jim', 'age': 21}, {'high': 175, 'gender': '男'}) #前dict中存在的键值对将会使后面dict中的键值对不会被从新合并,也能够使用update()方法对 #原字典更新新字典到里面,不过和直接合并的区别是,update会从新建立新字典,原字典更新删除 #数据不会影响新字典