Python中collections模块总结

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)])
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mandela688

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值