Collection模块
1. tuple”拆包"特性
代码示例:
t=("a",14,"f",55)
a,b,c,d = t #将t中的值依次赋给a,b,c,d
print(a,b,c,d)
a,b,*other = t # *other 代表除a,b以外的其它值的集合(注意:这是*的作用)
print(other)
print(a,b)
输出:
a 14 f 55
['f', 55]
a 14
小结:相对于list,tuple优点:
1.性能优化2.线程安全3.拆包特性4.可以作用dict的key
2. namedtuple详解
可以把namedtuple看作一个字典通过名字进行访问,使代码有了很好的可读性。
namedtuple的使用实例:
#声明
from collections import namedtuple
# 创建一个User对象的两种方式
User=namedtuple("User","name age height")
User=namedtuple("User",["name","age","height"])
#方法一
user_tuple1=User("Bob0",29,175)
print( user_tuple1.name , user_tuple1.age , user_tuple1.height)
#方法二
user_tuple=("Bob1",29,175)
user=User(*user_tuple) #映射 传递
print(user.name , user.age , user.height)
#方法二扩展
user_dict={
"name":"Bob1",
"age":29,
"height":175
}
user=User(**user_dict)
print(user.name,user.age,user.height)
输出:
Bob0 29 175
Bob1 29 175
Bob1 29 175
方法二改进,_make的使用
#_make的使用
user_tuple=("Bob2",29,175)
user=User._make(user_tuple)
print(user.name,user.age,user.height)
Bob2 29 175
修改对象属性,注意要使用"_replace"方法
user = user._replace(age=22)
print user
输出:
User(name='Bob2', age=22, height=175)
3. ChainMap详解
ChainMap用来将多个dict组成一个list,可以理解成合并多个字典
代码示例:
from collections import ChainMap
a={'a':4,'d':2}
b={'s':8,'z':7}
d={5:8}
c=ChainMap(a,b,d)
print(c)
print(c.maps) #将c变成一个list
输出:
ChainMap({'a': 4, 'd': 2}, {'s': 8, 'z': 7}, {5: 8})
[{'a': 4, 'd': 2}, {'s': 8, 'z': 7}, {5: 8}]
更新上述中的b的value值,会对ChainMap对象产生影响:
b['s']=1
print(c)
输出:
ChainMap({'a': 4, 'd': 2}, {'s': 1, 'z': 7}, {5: 8})
4. defaultdict详解
defaultdict与dict不同的是,当key不存在时会自动生成一个默认value值,因此,defaultdict可用来统计一个key对应的多个value的集合。
请看以下实例:
from collections import defaultdict
s=[('a',1),('a',3),('a',9),('b',1),('b',10)]
#d可以看作一个dict,dict的value是一个list
d=defaultdict(list)
for k,v in s:
d[k].append(v)
print(d)
输出:
defaultdict(<class 'list'>, {'a': [1, 3, 9], 'b': [1, 10]})
倘若s中的a对应value重复
s=[('a',1),('a',1),('a',9),('b',1),('b',10)]
这时,如何去除重复的value呢?
答:使用defaultdict(set),可解决问题。
from collections import defaultdict
d=defaultdict(set)
s=[('a',1),('a',1),('a',9),('b',1),('b',10)]
for k,v in s:
d[k].add(v)
print(d)
输出:
defaultdict(<class 'set'>, {'a': {1, 9}, 'b': {1, 10}})
拓展:
运用defaultdict(int)可统计一个字符串中每个字符出现次数
s="aaabbc"
d=defaultdict(int)
for k in s:
d[k]+=1
print(d)
输出:
defaultdict(<class 'int'>, {'a': 3, 'b': 2, 'c': 1})
5. deque详解
deque不仅高效地插入和删除容器的尾部元素,还支持高效插入和删除容器的头部元素,因此也叫做双端队列。
1.deque提供了类似list的操作方法(使用.append()来添加元素):
from collections import deque
a=[1,5,8,10,0]
d=deque() #创建deque序列
for i in a:
d.append(i)
print(d)
2.利用deque实现的删除与增添:
d.pop() #删除最右端
print(d)
d.popleft() #删除最左端
print(d)
d.append() #在最右端增加一个元素
print(d)
d.appendleft() #在最左端增加一个元素
print(d)
注意:
若使用以下代码:
k=d.popleft() #d.popleft()具有返回值
print(k) #k为最左端元素
print(d) #**d中的最左端元素已被删除**
3.限制deque的长度
d=deque(maxlen=20)
当限制长度的deque增加超过限制数的项时,先进入deque的内容就会被挤出来,剩下最新的元素。
6. Counter详解
Counter可以看作是一个计数器,用来统计相关元素出现统计次数。
统计列表中各个元素出现次数:
from collections import Counter
count=Counter() #建立一个空的Counter对象
s=[1,2,3,1,2,1]
for i in s:
count[i]+=1
print(count)
输出:
Counter({1: 3, 2: 2, 3: 1})
统计字符串中各个字符出现次数
string='abcaba'
for i in string:
count[i]+=1
print(count)
输出:
Counter({'a': 3, 'b': 2, 'c': 1})
拓展-----使用 .most_common(n) 来统计出现次数排名前n的元素:
from collections import Counter
count=Counter()
string='abcaba'
for i in string:
count[i]+=1
print(count.most_common(2))
输出:
[('a', 3), ('b', 2)]
7. OrderedDict详解
使用OrderedDict会根据放入元素的先后顺序进行排序,所以输出的值是排好序的。
应用实例:
from collections import OrderedDict
dd = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}
#按key排序 t[0]
kd = OrderedDict(sorted(dd.items(), key=lambda t:t[0]))
print(kd)
#按照value排序 t[1]
vd = OrderedDict(sorted(dd.items(),key=lambda t:t[1]))
print (vd)
输出:
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])