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的数据