基本数据类型操作的补充和set的基本操作
1,补充基本数据类型的知识点: " " .join(内容)...........什么加到什么里边,内容可以是:int,str,dic,tup.
lst = ["周树人", "周星星", "马化腾", "周树人"] lst1 = "周扒皮".join(lst) print(lst1) # 周树人周扒皮周星星周扒皮马化腾周扒皮周树人 s = "abc" s1 = s.join("123") print(s1) # 1abc2abc3 s2 = "123".join(s) print(s2) # a123b123c
小结:
- " ".join(内容)" "就限制了必须是str,把列表变成字符串
2,列表,字典在遍历循环的时候不能进行删除,因为删除以后lst或者dic的索引位置就发生了改变.
# for循环的时候不能删除的示例: li = [11, 22, 33, 44] for el in li: li.remove(el) print(li)
- 分析原因: for的运行过程. 会有⼀一个指针来记录当前循环的元素是哪⼀一个, 一开始这个指针指向第0 个. 然后获取到第0个元素. 紧接着删除第0个. 这个时候. 原来是第⼀一个的元素会⾃自动的变成 第0个. 然后指针向后移动⼀一次, 指向1元素. 这时原来的1已经变成了了0, 也就不会被删除了
解决方案:
- 通常采用的方法就是把li遍历出来,找到要删除的元素,记录在另一个list中,在根据新的list中的元素遍历出来再用list的删除操作即可
li = [11, 22, 33, 44] lst = [] # 定义一个空的列表,用于存放要删除的元素 for el in li: # 选择要删除的元素 if el == 22: lst.append(el) # 把要删除的元素存放到要删除的列表中 # for循环要删除元素的列表,进行删除 for i in lst: li.remove(i) # 就用remove指定元素删除 print(li) # [11, 33, 44]
- 注意: 由于删除元素会导致元素的索引改变, 所以容易易出现问题. 尽量量不要再循环中直接去删 除元素. 可以把要删除的元素添加到另⼀一个集合中然后再批量量删除.
3,dict中的fromkey(),可以帮我们通过list创建一个dict
dic = dict.fromkeys(["jay", "jj"], ["周杰伦", "麻花藤"]) print(dic) # {'jay': ['周杰伦', '麻花藤'], 'jj': ['周杰伦', '麻花藤']}
- 因此,dict.fromkeys().通过list来创建的dict,前边的list作为dict中的"key",第二个list作为dict中的"values".(list最多是2个列表,超过2个会报错)
dic = dict.fromkeys(["jay", "jj"], ["周杰伦", "麻花藤"]) dic.get("jay").append("容么么") print(dic) # {'jay': ['周杰伦', '麻花藤', '容么么'], 'jj': ['周杰伦', '麻花藤', '容么么']}
- 在这里,第二个list会作为第一个list中每一个元素的value,因此第二个list既是第一个list中第一个元素的value也是第二个元素的value,也是第三个元素的value.......,新dict中都是公用一个value值,因此改变dic其中一个"key"就会造成所有"keys"的"value"发生变化,且变化都是一样的.
4,数据的类型转换:转化成谁就用谁括起来
- 类型转换:
- 元组 => 列表 list(tuple)
- 列表 => 元组 tuple(list)
- list=>str str.join(list)
- str=>list str.split()
- 转换成False的数据: 0,'',None,[],(),{},set() ==> False
5,集合(set):set是python中基本数据类型之一,set集合一般用{}表示,set中的元素是无序的,不重复的,就是去掉value的字典(dict)
- set = {int,str,tup,bool}
- 1>我们可以去重:
lst = ["老郑", "老吴", "老孙", "老郑", "江小白"] print(id(lst)) # 1524458231688 lst = list(set(lst)) # 先把list转变成set(去重),然后再转变成list,数据强行转化,就直接括起来 print(lst, id(lst)) # ['老孙', '老郑', '老吴', '江小白'] 1524340690184 # 在去重的以后,原来的列表顺序是乱的,且生成一个新的列表
6,set的增删改查:
- 1>增加,格式是 .add()括号里边放的内容也必须是可哈希的(不可变的)当增加重复了以后,重复的内容不会被加到set中
s = {"刘嘉玲", "关之琳", "王祖贤"}
s.add("郑裕玲")
print(s) # {'刘嘉玲', '王祖贤', '关之琳', '郑裕玲'}
- 2>删除格式是 .remove()直接删除元素
- 3>修改,set中没有索引,因此不能进行修改
- 4>查,使用for循环
- 5>set集合本⾝身是可以发生改变的. 是不可hash的. 我们可以使用frozenset来保存数据. frozenset是不可变的. 也就是⼀一个可哈希的数据类型
s = frozenset(["赵本山", "刘能", "皮长山", "常规"]) dic = {s: "123"} # 此时s就是一个不可变,可哈希的了 print(dic) #{frozenset({'常规', '皮长山', '刘能', '赵本山'}): '123'}
7,深浅拷贝: 格式是 .copy() lst2 = lst1.copy()
- 1>浅拷贝(进行赋值操作,实际上是引用内存地址的赋值,内存中此时只有一个变量,浅拷贝以后的2个比赛能力是哪个指向同一个内存地址)
lst1 = ["金毛狮王", "紫衫龙王", "白眉鹰王", "青翼蝠王"] lst2 = lst1 print(lst1, id(lst1)) # ['金毛狮王', '紫衫龙王', '白眉鹰王', '青翼蝠王'] 2644564539336 print(lst2, id(lst2)) # ['金毛狮王', '紫衫龙王', '白眉鹰王', '青翼蝠王'] 2644564539336 lst1.append("杨逍") print(lst1) # ['金毛狮王', '紫衫龙王', '白眉鹰王', '青翼蝠王', '杨逍'] print(lst2) # ['金毛狮王', '紫衫龙王', '白眉鹰王', '青翼蝠王', '杨逍']
- dict,set,list都是一样的效果,把内存地址赋值给变量,所以其中一个变量变,其他变量也跟着变,且注意浅拷贝只是拷贝了没有嵌套的元素,子元素并没有拷贝
- 2>深度拷贝:import copy copy.deepcopy( )
import copy lst = ["老郑", "老吴", "老孙", ["老郑", "江小白"]] lst1 = copy.deepcopy(lst) lst.append("撸串") print(lst) # ['老郑', '老吴', '老孙', ['老郑', '江小白'], '撸串'] print(lst1) # ['老郑', '老吴', '老孙', ['老郑', '江小白']] print(id(lst)) # 1833936559880 print(id(lst1)) # 1833886006792
浙公网安备 33010602011771号