tuple
- keywords:不可变,可迭代,拆包
tuple=(a,b,c)
tuple[0]=d#错误
tuple=(a,[b,c])
tuple[1].append(d)#不可变不是绝对的
a,b,c=tuple#拆包
a,*others=tuple#只对a感兴趣
- tuple vs. list
性能优化:元素全为tuple时显著加速
线程安全:不可变
可以作为dict的key:不变,可hash
dict[(a,b,c)]=d#正确
dict[[a,b,c]]=d#错误
拆包特性
与C语言相比,tuple对应struct,list对应array
namedtuple
创建类:
from collections import namedtuple
User=namedtuple("User",["name","age","height","weight"])
user=User(name="qiuxinling",age=18,height=165,weight=50)
name,age,*others=user
user_tuple=('qiuxinling',18,165)
user=User(*user_tuple,50)
user_dict={name='qiuxinling',age=18,height=165}
user=User(**user_dict,weight=50)
user_tuple=('qiuxinling',18,165,50)
user_list=['qiuxinling',18,165,50]
user_dict={name='qiuxinling',age=18,height=165,weight=50}
user=User._make(user_tuple)
user=User._make(user_list)
user=User._make(user_dict)#可迭代对象,参数必须全部赋值
defaultdict
dict.setdefaultdict(user,0)#等价于dict[user]=0
dict=defaultdict(list)#创建字典,value为list,默认为[]
dict=defaultdict(int)#创建字典,value为int,默认为0
users=[a,b,c]
for u in users:
dict[u]+=1
#字典套字典
def gen_default():
return {
"name":"",
"nums":0
}
dict=defaultdict(gen_default)
print(dict["group1"])#{"group1":{"name":"","nums":0}}
deque
双端队列:对可迭代对象左右两边进行操作
deque是线程安全的,list非线程安全的
from collections import deque
user_deque=deque(["qiuxinling1","qiuxinling2","qiuxinling3"])
user_deque.appendleft("qiuxinling0")
print(user_deque[0])
user_deque1=user_deque.copy()#浅拷贝
user_deque1=copy.deepcopy(user_deque)#深拷贝
Counter
from collections import Counter
#对可迭代对象进行统计。字典的子类
user="n;sldvjoajdvoi"
user_counter=Counter(user)
user_counter2=Counter("ackhalkdvh;oahvoie")
user_counter.update(user_counter2)
#topn问题
user_counter.most_common(2)#出现次数最多的2个元素,用堆创建
OrderedDict
user_dict=OrderDict()
user_dict["a"]='qxl1'
user_dict["c"]='qxl2'
user_dict["b"]='qxl3'
#OrderedDict([('a','qxl1'),('c','qxl2'),('b','qxl3')])#与添加顺序一致,dict顺序是无序的
user_dict.popitem()#('b','qxl3')
user_dict.pop('a')#'qxl1'
user_dict.move_to_end('b'))#移到最后
ChainMap
from collections import ChainMap
user_dict1={"a":"qxl1","b":"qxl2"}
user_dict1={"c":"qxl3","d":"qxl4"}
new_dict=ChainMap(user_dict1,user_dict2)#将两个dict模拟为一个,[user_dict1,user_dict2]
new_dict.new_child({"aa":"aa"})#添加字典
print(new_dict.maps[0]["a"])#"qxl1"
for k,v in new_dict.items():
pritn(k,v)