欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

集合和基础类型的填坑以及深浅拷贝

程序员文章站 2022-03-13 19:22:53
S2_Day1 一、集合 关键字 : set 是不可哈希的(可变的),也是无序的(没有索引),集合内的元素​必须是可哈希的(不可变得)。 定义是 s = {} #当里面没有元素的时候​​表现为字典数据类型 方法: 增: .add(元素)​​​ #随记添加在集合的某个位置 .update() #迭代添 ......

s2_day1

一、集合

关键字 : set 是不可哈希的(可变的),也是无序的(没有索引),集合内的元素​必须是可哈希的(不可变得)。

定义是 s = {}    #当里面没有元素的时候​​表现为字典数据类型         

方法:

:

.add(元素)​​​       #随记添加在集合的某个位置

.update()         #迭代添加

:

.pop() #随机删除 ,有返回值,删除什么返回什么元素

.clear() #清空集合

del set #删除整个集合​​

.​​remove(元素)​ #删除指定的元素

:​

只能先用remove()把要改的元素删了,在把需要的元素添加进去​​

集合的特性:

集合是可以天然去重​​​​! 

#面试题:1,lis = [1,2,1,2,1,25,1,5,6,9,8,115,226,11,22,11,22]​用一行代码去重?

    print(list(set(lis)))​       

#将列表转换为集合去重,然后在换回列表即可

集合的其他操作:

& 和 intersectiion   #取两个集合的交集 没有交集就返回空集合

|​                             #取两个集合的并集,合并两个集合

s - s1                     #取后面相对于前面的补集​​ 

s ^ s1                     #反交集,取两个集合不重合的元素​​

s < s1                    #判断s是不是s1的子集

s1 > s                    #判断s1是不是s的父集

.frozenset():           #将集合冻住,即变成不可变得数据(可哈希)

a = frozenset({1,2,3,4})​​​​​​​ #将集合冻住,变成不可变得数据,即可以当字典的键​

dic[a :1]

print(dicup)

 

二、二次编码

 ascii码不支持中文

 unicode 万国码 中文四个字节 英文两个字节​

 utf-8 最少使用一个字节,欧洲两个字节,亚洲三个字节

 gbk 中文两个字节,英文一个字节​

a = '你好黑'

a . encode('gbk')   #编码​​​ 括号里放编码方式,将其变为什么编码

a.decode(''gbk')    #解码 ,必须用同一种编码方式

注意:用什么编码就用什么解码

#在国内windows系统默认使用gbk编码方式

#bytes 字节 是一个数据类型 是用来存储和传输

三、基础补充

#1.用for循环将列表清空 (错误方式)

lst = [1,2,3,4,5]

for i in lst:   #这种问题是for循环的循环机制导致的,这个是当for要循环的数据为空时,他就停止循环

lst.remove(i)    #这样子删除不行,循环删除是位置上的值,当这个位置删除过

print(lst)       #了,下次再循环就不会再删除这个位置了

#2.正确方式

lst = [1,2,3,4,5]

for i in range(len(lst)):   #通过for实现循环次数,但是并不参与删除操作

lst.pop(0)     #默认删除最后一个,可以规避掉for的循环机制

print(lst)

 

lst = [1,2,3,4,5]           

lst1 = []                          #通过另建一个新表
for i in lst: 

  lst1.append(i) #使用另一个列表来规避掉for的循环机制

for k in lst1:   lst.remove(k)   print(lst)

 

#字典在for循环中是不能进行删除的但是可以用方法规避在原字典使用for循环

dic = {'a':1,'b':2}

dic1 = {}                       #通过建立一个新的字典

for i in dic:

  dic1[i] = dic[i] #规避for的循环机制 for i in dic1:   dic.pop(i)   print(dic) dic = dict.fromkeys(['alex','wusir'],[]'太白','姗姗') # 第一个是键,第二是 dic['alex'].append('老村长') # 值,这个方法快速大量的建立很多值是一样的键值
对,他们用的值是一样的,所有的内存地址是一样的 print(dic)

 

四、深浅拷贝

注意只有使用了  .deepcopy方法才能进行深度拷贝!  

import copy

lst = copy.deepcopy(lst1)

 

 

浅拷贝: 拷贝的是第一层,将第一层的内容复制,第二级元素却公用一个内存地址,既将第一层没有第二层元素的元素复制到新的地址,有第二层元素的第一层元素还是共用的。

lst1 = ["何炅", "杜海涛","周渝⺠"]
lst2 = lst1.copy()
lst1.append("李嘉诚")
print(lst1)
print(lst2)
print(id(lst1), id(lst2))
结果:
两个lst完全不⼀样. 内存地址和内容也不⼀样. 发现实现了内存的拷⻉
lst1 = ["何炅", "杜海涛","周渝⺠", ["麻花藤", "⻢芸", "周笔畅"]]
lst2 = lst1.copy()
lst1[3].append("⽆敌是多磨寂寞")
print(lst1)
print(lst2)
print(id(lst1[3]), id(lst2[3]))
结果:
['何炅', '杜海涛', '周渝⺠', ['麻花藤', '⻢芸', '周笔畅', '⽆敌是多磨寂寞']]
['何炅', '杜海涛', '周渝⺠', ['麻花藤', '⻢芸', '周笔畅', '⽆敌是多磨寂寞']

 

深拷贝: 彻底拷贝,拷贝完之后两个内容完全不一样,内存地址也不一样​,就是说拷贝完之后的数据与原数据没有一点关系。

 

import copy
lst1 = ["何炅", "杜海涛","周渝⺠", ["麻花藤", "⻢芸", "周笔畅"]]
lst2 = copy.deepcopy(lst1)
lst1[3].append("⽆敌是多磨寂寞")
print(lst1)
print(lst2)
print(id(lst1[3]), id(lst2[3]))
结果:
['何炅', '杜海涛', '周渝⺠', ['麻花藤', '⻢芸', '周笔畅', '⽆敌是多磨寂寞']]
['何炅', '杜海涛', '周渝⺠', ['麻花藤', '⻢芸', '周笔畅']]
4447221448 4447233800
都不⼀样了.

 

 

 

#面试题: ​​写出下面的结果

a = [1,2]

a[1] = a

print(a[1])​​ 输出是: [1, [...]]

四,课堂随笔

#集合
'''
s = {}                                  #空的{}代表空的字典,而不是集合
print(type(s))
'''
s = {1,2,3,4,5,6,7,8,9}
#添加
s.add('a')                                    #添加指定元素
s.update('alex')                            #添加可迭代元素
#删除
s.remove(1)                                  #删除指定元素
s.pop()                                      #随机删除 删除什么返回什么
s.clear()                                     #清空集合
print(s)                                      #字典自动去重

#基础补充
#1.用for循环将列表清空 (错误方式)
'''
lst = [1,2,3,4,5]
for i in lst:                 #问题是for循环的循环机制导致的,这个是当for要循环的数据为空时,他就停止循环
    lst.remove(i)              #这样子删除不行,循环删除是位置上的值,当这个位置删除过
print(lst)                     # 了,下次再循环就不会再删除这个位置了
'''
#2.正确方式
'''
lst = [1,2,3,4,5]
for i in range(len(lst)):
    lst.pop(0)
print(lst)
'''
'''
lst = [1,2,3,4,5]
lst1 = []
for i in lst:
    lst1.append(i)
for k in lst1:
    lst.remove(k)
print(lst)
'''
#字典在for循环中是不能进行删除的
#但是可以用方法规避在原字典使用for循环
'''
dic = {'a':1,'b':2}
dic1 = {}
for i in dic:
    dic1[i] = dic[i]
for i in dic1:
    dic.pop(i)
print(dic)
'''
'''
dic = dict.fromkeys(['alex','wusir'],[]'太白','姗姗') # 第一个是键,第二是
dic['alex'].append('老村长')   # 值,这个方法快速大量的建立很多值是一样的键值对,他们用的值是一样的,所有的内存地址是一样的
print(dic)
'''
#深浅拷贝
#1.浅拷贝
a = [1,2]
a[1] = a
print(a[1])

 

lst1 = ["何炅""杜海涛","周渝⺠"]
lst2 = lst1.copy()
lst1.append("李嘉诚")
print(lst1)
print(lst2)
print(id(lst1), id(lst2))
结果:
两个lst完全不⼀样. 内存地址和内容也不⼀样. 发现实现了内存的拷⻉
lst1 = ["何炅""杜海涛","周渝⺠", ["麻花藤""⻢芸""周笔畅"]]
lst2 = lst1.copy()
lst1[3].append("⽆敌是多磨寂寞")
print(lst1)
print(lst2)
print(id(lst1[3]), id(lst2[3]))
结果:
['何炅''杜海涛'