python:set集合 字典的formkeys() 深浅拷贝

practice  

一、对之前内容的补充

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 '''

 

posted @ 2018-08-03 15:31  葡萄想柠檬  Views(903)  Comments(0)    收藏  举报
目录代码