python-collections模块小结(namedtuple、defaultdict、deque等)

collections中有很多模块,包括tuple这个是最基础的数据结构,而一些常用模块比如namedtuple、defaultdict等能让程序更加简洁明了,易读效率高,了解一下。


拆包:
tuple=("周",24,175) # 换成List也可以拆包
name, age, height =tuple  
name,*other =tuple 
print(name,other) # 输出周,[24,175]


什么叫可哈希?简单理解可哈希就是可不可以转化散列dict,不可变类型都可哈希(Python 中不可变类型有:int,float,string,tuple;可变类型有:list,dict,set等,numpy中的matrix和ndarray也是可变的),所以tuple可哈希,list不可以 

# namedtuple可创建类,创建简单对象时实用,创建class会创建很多内置对象而namedtuple不会,而且可以进行拆包转dict等操作,类不行
 User = namedtuple("User",["name","age"]) # 相当于创建了User类,name和age是属性
 user=User("bobby",24)
print(user.name,user.age) #可输出user对象的name和age

# 函数参数*与**
User = namedtuple("User",["name","age","degree"]) 
tuppp=("zhou",24) #定义一个变量
user= User(*tuppp,“master”)# *将元组按顺序传入,列不足补齐
#一般来讲,传参有两种方式,一种是*传的是元组,一种是**传的是字典
user=User("zhou",24) #元组
user=User(name="zhou",age=24) #字典
#上面说过传元组可用*[元组名] ,而传字典可用**[字典名]
 dictt={name:"zhou",age:24}
user=User(**dictt,degree="master") 
 
#defaultdict 
#一种题:统计列表同名项出现次数
list1=[1,2,1]
dict={}
for k in list1:
   if k not in dict:
      dict[k]=0
   else:dict[k]+=1
#另一方法利用默认值方式,性能更高,少做一次dict查询操作
for k in list1:
   dict.setdefault(k,0)
   dict[k]+=1
#利用defaultdict会更简单
from collections import defaultdict#别忘记要导入
dict1=defaultdict(list)#则dict的value默认为[],int默认为0,如果传dict要注意不能直接用
dict1=defaultdict(int)
for k in list1:
   dict1[k]+=1#逻辑简单严谨


# 双端队列deque(c语言写的,效率高)
from collections import deque#别忘记要导入
deque_list=deque(["bo1","bo2"])#初始化,使用可迭代对象初始化,元组,列表或者字典的keys。一个良好习惯,列表里都存放同类型的数据,元组习惯可用于属性("name",24,175)
deque_list.appendleft("bo3")#deque多了很多对队列头尾的操作方式,其实list也有insert啊
#copy与deepcopy,浅拷贝只针对元素,比如list里有list这种可变对象,浅拷贝后list里的list还是同步变化。深拷贝可以避免这种情况
#deque是线程安全的,通过GIL全局解释技术,list不是线程安全的

# counter统计
from collections import deque#别忘记要导入
list1=["b1","b2","b1"]
cou=Counter(list1)#可迭代对象,list,tuple或者字符串
print(cou)#输出counter({"b1":2,"b2":1}),一个字典型的统计输出
#有update方法可以添加新元素等,有most_common可以统计出现最多次的元素,使用堆实现,效率高

# orderedDict有序的字典,这个有序指添加顺序,先添加哪个就排第一个,python3之后默认有序。orderedDict是dict子类,有额外方法,如popitem()移除最后一个键值对,move_to_end移动某一元素至最后
# chainMap就是把多个dict糅合成一个,但是不会产生新的引用,修改chainMap里的数据就是修改对应dict的数据

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值