一,集合
集合时无序的,不重复的数据集合,它里面的元素时可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:
1.去重:把一个列表变成集合,就自动去重了。
2.关系测试:测试两组数据之前的交集,差集,并集等关系
1.集合的创建:
#第一种: set1 = {'alex', 'wusir'} #第二种 set2 = set({'alex', 'wusir'})
2.集合的增删:
#增 set1 = {'alex','wusir','ritian','egon','barry'} set1.add('女神') print(set1) set1.updata('abc') #相当于extend,迭代增 print(set1)
# 删 set1.remove('alex') #根据元素删除,若需要删除的元素不存在,则报错 print(set1) set1.pop() #随机删除一个元素,返回被删除元素,若集合为空则报错 print(set1) set1.clear() #清空集合 print(set1) del set1 #从内存级别上删除集合 print(set1)
3.集合的关系测试
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} # 交集 print(set1 & set2) print(set1.intersection(set2)) # 并集 print(set1 | set2) print(set1.union(set2)) # 反交集 print(set1 ^ set2) print(set1.symmetric_difference(set2)) # 差集 set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 - set2) print(set1.difference(set2)) set1 = {1,2,3} set2 = {1,2,3,4,5,6} # 子集 print(set1 < set2) # True print(set1.issubset(set2)) # 超集 print(set2 > set1) print(set2.issuperset(set1))
集合转换为不可变数据类型:
#冻集合
set1 = {1,2,3}
set3 = frozenset(set1)
print(set3) # 不可变的数据类型。 ***
常见的集合面试题:
# 面试题:list去重 ***** l1 = [1,1,2,3,4,4,5,6,7,8] set1 = set(l1) l2 = list(set1) print(l2)
二,深浅拷贝
# 赋值运算 l1 = [1,2,3] l2 = l1 #l2,l1指向的内存地址一样 l1.append(666) print(l2) print(id(l1)) print(id(l2))
浅拷贝:第一 层在内存中是独立的,从第二层开始以及更深的层数,都是使用同一个
l1 = [1,2,3] l2 = l1.copy() l1.append(666) print(l2) l1 = [1,2,3,[22,]] l2 = l1.copy() l1[-1].append('taibai') print(id(l1)) print(id(l2)) print(id(l1[-1])) print(id(l2[-1]))
深拷贝:完全独立互不影响
import copy l1 = [1,2,3,[22,]] l2 = copy.deepcopy(l1) l1[-1].append('太白') print(l2)
应用场景:
浅copy:如果一份数据(列表)第二层时,你想与原数据进行公用
深copy:完全独立的copy一份数据,与原数据没有关系。
常见的深浅拷贝面试题:
1.解释深浅copy
2.切片是属于深copy还是浅copy
# 切片属于浅copy l1 = [1,2,3,[22,33]] l2 = l1[:] l1.append(666) l1[-1].append(666) print(l2)
三,基础数据类型的补充知识
# 元组
# 如果元组中只有一个数据,且没有逗号,则该 '元组' 与里面的数据的数据类型相同。 tu1 = (1,) tu2 = ('alex') #str字符型 tu3 = ([1,2,3],) print(tu1,type(tu1)) print(tu2,type(tu2)) print(tu3,type(tu3))
# 列表 # 列表与列表可以相加 l1 = [1,2,3] l2 = ['alex','wusir'] l3 = l1 + l2 print(l3) # 在循环一个列表时,如果对列表中的某些元素进行删除,那么此元素后面的所有元素就会向前进一位,他们的索引就会发生变化。 # 在循环一个列表时,最好不要对此列表进行改变大小(增删)的操作。 例:将列表中索引为奇数的元素,全部删除 l1 = [11, 22, 33, 44, 55, 66, 77, 88] # 方法一:切片+步长删除 del l1[1::2] print(l1) #方法二: l2 = [] for i in range(len(l1)): if i % 2 == 0: l2.append(l1[i]) print(l2) l1 = l2 print(l1) # 方法三:倒着删除 for index in range(len(l1)-1, -1, -1): if index % 2 == 1: l1.pop(index) print(l1)
# 字典 # fromkeys() # dic1 = dict.fromkeys([1,2,3],'alex') # print(dic1)
常见的字典面试题:
描述创建字典的几种方式
#第一种 dic = {'name':'alex'} #第二种 dic = dict({'name':'alex'}) print(dic) #第三种 使用romkeys()函数创建一个字典
字典 fromkeys函数的陷阱
# 陷阱: dic1 = dict.fromkeys([1,2,3],[]) print(dic1) dic1[1].append('alex') print(dic1) print(id(dic1[1])) print(id(dic1[2])) print(id(dic1[3]))
# dictionary changed size during iteration: 在循环一个字典时,不能改变字典的大小 例:将 dic的键中含有k元素的所有键值对删除。 dic = {'key1': 'value1','key2': 'value2', 'k3':'v3', 'name': 'alex'} l1 = [] for key in dic: if 'k' in key: l1.append(key) print(l1) for key in l1: dic.pop(key) print(dic) #错误示范 # for key in dic: # if 'k' in key: # dic.pop(key)
数据类型的转换
#str与list互相转换 # str ---> list s1 = 'alex wusir taibai' l1 = s1.split() print(l1) # list ---> str 此list中的元素全部是str类型,否则报错 l1 = ['alex', 'wusir', 'taibai'] s2 = ' '.join(l1) print(s2)
#tuple与list互相转换 # tuple <--- list l1 = [1,2,3] tu1 = tuple(l1) print(tu1) # tuple ---> list tu2 = (0,2,3) l1 = list(tu2) print(l1)
#str与bytes互相转换 编码:encode str --->bytes s1 = 'alex' b1 = s1.encode('utf-8') 解码:decode bytes ---> str s2 = b1.decode('utf-8') #s2为unicode编码
#字典转换为列表 #dict.keys() dict.values() dict.items() list() dic1 = {'name': 'alex', 'age': 1000} l1 = list(dic1) print(l1)
#布尔值为False的数据类型 int型:0 str型:'' #空字符 list型:[] #空列表 dict型:{} #空字典 tuple型:() #空元组 set型:set() #空集合