Day7 集合、深浅copy、数据类型转换及一些坑
集合
Set={'wusir','alex',1,2,3}
集合要求里面的元素必须是不可变的数据类型,但是集合本身是可变的数据类型。
集合里面的元素不重复(天然去重),无序。
主要用途:1,去重。
2,关系测试。
去重
l1 = [1,1,2,3,4,4,3,2,1,5,5] set1 = set(l1) l2 = list(set1)
增和删
set1.add('abc')#直接加 set1.update('abc')#迭代着加,相当于extend
set1.remove('abc')#直接删
set1.pop()#随机删
set1.clear()#清空集合
del set1#在内存上删除整个集合
discard#删除,没有的话不会报错
关系测试
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)) 差集 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) # 不可变的数据类型。
深浅copy
浅copy:l1中的列表加了一个666,l2也会跟着一起加 l1 = [1,2,3,[4,5,6,7],8,9] l2 = l1.copy() l1[3].append(666) print(l2) 深copy import copy l1 = [1,2,3,[22,]] l2 = copy.deepcopy(l1) print(l1,l2) l1.append(666) l1[-1].append('太白') print(l2)
各数据类型的转换
字典
dict = {'name': 'Zara', 'age': "7", 'class': 'First'}
字典转为字符串
1.print(str(dict),type(str(dict)))
返回{'name': 'Zara', 'age': "7", 'class': 'First'}
2.print("".join(dict))
将字典中所有的key转成字符串(前提是所有的key都是str)
3.print("".join(dict.values()))
将字典中所有的value转成字符串(前提是所有的value都是str)
字典转元组
1.print(tuple(dict))
将字典中所有的key转成元组
2.print(tuple(dict.values()))
将字典中所有的value转成元组
字典转列表
1.print(list(dict)
将字典中所有的key转成列表
2.print(tuple(dict.values()))
将字典中所有的key转成列表
元组
tup=(1, 2, 3, 4, 5)
qwe = ("hi","hello","world")
元组转字符串
1.print(str(tup),type(str(tup)))
print(str(qwe),type(str(qwe)))
2.print("".join(qwe)) (前提是qwe中的数据类型都是str)
元组转列表
print(list(tup))
元组不能转字典
列表
nums=[1, 3, 5, 7, 8, 13, 20];
l1 = ["hi","hello","world"]
列表转字符串
1.print(str(nums))
2.print(" ".join(l1)) (前提是l1中的数据类型都是str)
列表转元组
1.print(tuple(nums))
2.print(tuple(l1))
列表不能转字典
字符串
s1="1,2,3"
s2="hi hello world"
字符串转列表
1.print(list(eval(s1)))适用于s1这种字符串里是int类型的
2.print(s1.split())
字符串转元组
1.print(tuple(eval(s1)))不适用s1里面有str
2.print(tuple(s2.split()))适用于s2里都是str
字符串转字典
sd = "{'name':'ljq', 'age':24}"
print(eval(sd))
一些坑
元组
如果元组中只有一个数据,且没有逗号,则该 '元组' 与里面的数据的数据类型相同。
tu1 = (1,) tu2 = ('abc') tu3 = ([1,2,3],) print(tu1,type(tu1)) print(tu2,type(tu2)) print(tu3,type(tu3))
列表
在循环一个列表时,如果对列表中的某些元素进行删除,
那么此元素后面的所有元素就会向前进一位,他们的索引就会发生变化。
l1 = [11, 22, 33, 44, 55, 66, 77, 88] #这样在循环里面删除结果与预期不一样 for i in range(len(l1)): if i % 2 == 1: l1.pop(i) print(l1) 解决:可以倒着删除 for index in range(len(l1)-1, -1, -1): if index % 2 == 1: l1.pop(index) print(l1)
在循环一个列表时,最好不要对此列表进行改变大小(增删)的操作。
字典
字典创建的第三中方法
创建字典的第三中方法,但是这种字典里面的value是指向同一地址,改一个另外的也一起改了。 fromkeys() dic1 = dict.fromkeys([1,2,3],'abc') print(dic1)
在循环一个字典时,不能改变字典的大小。
dic = {'key1': 'value1','key2': 'value2', 'k3':'v3', 'name': 'alex'} 将 dic的键中含有k元素的所有键值对删除。 for key in dic: if 'k' in key: dic.pop(key) dictionary changed size during iteration: 在循环一个字典时,不能改变字典的大小。 解决:加一个列表 l1 = [] for key in dic: if 'k' in key: l1.append(key) # print(l1) for key in l1: dic.pop(key) print(dic)