python:set集合 字典的formkeys() 深浅拷贝
一、对之前内容的补充
1. 字符串的 join( )用法 把列表转换成字符串
# 将列表转换成字符串,每个元素之间用_拼接 s='_'.join(['高华新','刘清扬','崔园樟']) #join() 跟的是可迭代对象 print(s) # 高华新_刘清扬_崔园樟
字符串.split( ) 用法 把字符串转换成列表
# 把字符串转换成列表用切割,split ss='高华新_刘清扬_崔园樟' ss1=ss.split("_") print(ss1) #['高华新', '刘清扬', '崔园樟']
2. 列表list和字典dict的遍历删除
字典和列表在循环的时候不能直接删除
需要把删除的内容记录在新的列表中
然后循环新的列表,删除原列表或原字典
列表错误示范:
lst=['紫云','大云','玉溪','紫钻'] # 循环删除是错误的 for el in lst: #有一个变量来记录当前循环的位置 lst.remove(el) print(lst) #['大云', '紫钻'] 未删干净 隔一个删一个 #总结: # 删除的时候发现,剩余一些内容.原因是内部的索引在改变. # 需要把删除的内容记录下来,然后循环新列表,删除原来的列表
字典错误示范:
会报错提示,字典在循环时不能改变长度即不能进行操作
正确做法:
列表:
lst=['紫云','大云','玉溪','紫钻'] new_lst=[] #新列表用来记录元列表中的信息 for el in lst: new_lst.append(el) for el in new_lst: # 循环新列表,删除原列表 lst.remove(el) print(lst) 字典:
dic={'提莫':'冯提莫','发姐':'陈一发'} li=[] for k in dic: li.append(k) for i in li: dic.pop(i) print(dic)
3. 字典的 fromekeys( ) 用法
1)返回新字典,对原字典没有影响
2)后面的 value 是多个 value 共享的值
fromkeys(a,b) 获取a中的每一个元素和b组成键值对,形成新的字典
dic = {"apple":"苹果", "banana":"香蕉"}
ret = dic.fromkeys("orange", "橘子") # 直接用字典去访问fromkeys不会对字典产生影响
print(ret)
#{'o': '橘子', 'r': '橘子', 'a': '橘子', 'n': '橘子', 'g': '橘子', 'e': '橘子'}
ret = dict.fromkeys("abc",["哈哈","呵呵", "吼吼"]) # fromkeys直接使用字典类名进行访问
print(ret)
#{'a': ['哈哈', '呵呵', '吼吼'], 'b': ['哈哈', '呵呵', '吼吼'], 'c': ['哈哈', '呵呵', '吼吼']}
a = ["哈哈","呵呵", "吼吼"] ret = dict.fromkeys("ab", a) # fromkeys直接使用类名进行访问 a.append("嘻嘻") #同样会添加到字典中,因为a的地址没有变 print(ret) #{'a': ['哈哈', '呵呵', '吼吼', '嘻嘻'], 'b': ['哈哈', '呵呵', '吼吼', '嘻嘻']}
二、set 集合
特点:
元素是可哈希的即不可变的
无序的
不可重复的, 可以用于去重(重复的内容不打印)
(存储的是字典里的key,不存储value)
集合本身是可变的数据类型, 不可哈希, 有增删改查的操作
frozenset( )可以冻结集合,使集合 不可变, 可哈希
s={'aa','hufh','koi'} #set集合
s1={'aa','hufh','koi',('1',2)} #可含有tuple
s2={'aa','hufh','koi',['1',2]} #错误的 含有list不可哈希
去重:
lst = [11,5,4,1,2,5,4,1,25,2,1,4,5,5] s = set(lst) # 把列表转换成集合. 进行去重复 lst = list(s) # 把集合转换回列表. print(lst)
冻结:
s=frozenset(['hh','ji','de']) dic={s:'123'} #集合s冻结后不可变,可以做字典的key print(dic) #{frozenset({'de', 'hh', 'ji'}): '123'}
三、深浅拷贝
赋值 浅拷贝 深拷贝
1. 赋值 没有创建新的对象地址(不算是拷贝),公用同一个地址
lst1=['金毛狮王','紫衫龙王','青翼蝠王','白眉鹰王'] lst2=lst1 # 赋值的是地址, 俩列表使用的是同一个地址 lst1.append("杨逍") print(lst1) print(lst2) #['金毛狮王', '紫衫龙王', '青翼蝠王', '白眉鹰王', '杨逍'] #['金毛狮王', '紫衫龙王', '青翼蝠王', '白眉鹰王', '杨逍']
2.浅拷贝 创建了新对象
只拷贝第一层的内容,形式有: 切片[ : ] 和 copy( )
1 lst1=['金毛狮王','紫衫龙王','青翼蝠王','白眉鹰王'] 2 # lst2=lst1[:] #浅拷贝 3 lst2=lst1.copy() #浅拷贝, 会产生新的地址 4 lst1.append("杨逍") #不会改变lst2中的元素 5 print(lst1) 6 print(lst2) 7 #['金毛狮王', '紫衫龙王', '青翼蝠王', '白眉鹰王', '杨逍'] 8 #['金毛狮王', '紫衫龙王', '青翼蝠王', '白眉鹰王'] 9 10 lst1=['金毛狮王','紫衫龙王','青翼蝠王','白眉鹰王',['张无忌','赵敏','周芷若']] 11 # lst2=lst1[:] #浅拷贝 12 lst2=lst1.copy() #浅拷贝, 会产生新的地址 13 lst1[4].append("小昭") #在浅拷贝中,第二层的内容拷贝的是地址, 14 print(lst1) 15 print(lst2) 16 #['金毛狮王', '紫衫龙王', '青翼蝠王', '白眉鹰王', ['张无忌', '赵敏', '周芷若', '小昭']] 17 #['金毛狮王', '紫衫龙王', '青翼蝠王', '白眉鹰王', ['张无忌', '赵敏', '周芷若', '小昭']]
3.深拷贝 创建了新对象
拷贝所有的内容, 对原数据操作,不会影响新拷贝的内容
需要引入模块: import copy
copy.deepcopy( )
1 # 引入copy模块 2 import copy 3 lst1 = ["金毛狮王", "紫衫龙王", "青翼蝠王", "白眉鹰王",["张无忌","赵敏","周芷若"]] 4 # lst2 = lst1[:] # 浅拷贝 5 # lst2 = lst1.copy() # 浅拷贝中lst1 和 lst2 中的列表的地址是一样的 6 lst2 = copy.deepcopy(lst1) # 深拷贝中lst1 和 lst2 中的列表的地址是不一样的 7 lst1[4].append("小昭") 8 print(lst1) 9 print(lst2) 10 print(id(lst1[4])) 11 print(id(lst2[4])) 12 ''' 13 ['金毛狮王', '紫衫龙王', '青翼蝠王', '白眉鹰王', ['张无忌', '赵敏', '周芷若', '小昭']] 14 ['金毛狮王', '紫衫龙王', '青翼蝠王', '白眉鹰王', ['张无忌', '赵敏', '周芷若']] 15 40315912 16 40415688 17 '''

浙公网安备 33010602011771号