Python中的集合
1.dict中的fromkeys(a, b)函数:
把a迭代后的每一个元素作为一个key,value都是相同的b
dic = dict.fromkeys(["a", "b"], ["1", "2"]) print(dic) #结果:{'a': ['1', '2'], 'b': ['1', '2']} dic = dict.fromkeys("abcd", ["1", "2"]) print(dic) #结果:{'a': ['1', '2'], 'b': ['1', '2'], 'c': ['1', '2'], 'd': ['1', '2']}
这时如果改变b,那么每一个value都将会改变:
dic.get("a").append("888") print(dic) #结果是{'a': ['1', '2', '888'], 'b': ['1', '2', '888']}
2.集合(set)
一般不是很常用. set中的元素是不重复的.无序的.里面的元素必须是可hash的(int, str, tuple,bool), 我们可以这样来记. set就是dict类型的数据但是不保存value, 只保存key. set也用{}表示
set集合中的元素必须是可hash的, 但是set本身是不可hash得. set是可变的.
2.1增删改查
增加:
add(a)函数,a必须是set中没有的
a.update(b):迭代更新,把b迭代,然后加入集合a中
例:
s = {"刘嘉玲", '关之琳', "王祖贤"} s.update("麻花藤") # 迭代更新 print(s) #{'王祖贤', '花', '刘嘉玲', '麻', '关之琳', '藤'}
删除:
pop():随机删除
remove(a):直接删除a,如果集合中不存在a,则会报错
clear():清空
修改:
因为没有索引,无法定位,只能用先删除,后增加的方法进行修改
查询:
集合是一个可迭代对象,可以用for循环遍历
常用操作:
s1 = {"a", "b", "c"} s2 = {"c", "d", "e"} # 交集 # 两个集合中的共有元素 print(s1 & s2) # {'c'} print(s1.intersection(s2)) # {'c'} # 并集 print(s1 | s2) # {'e', 'd', 'b', 'a', 'c'} print(s1.union(s2)) # {'e', 'd', 'b', 'a', 'c'} # 差集 print(s1 - s2) # {'a', 'b'} print(s1.difference(s2)) # {'a', 'b'} # 反交集 print(s1 ^ s2) # 两个集合中单独存在的数据 {'e', 'a', 'd', 'b'} print(s1.symmetric_difference(s2)) # 两个集合中单独存在的数据 {'e', 'a', 'd', 'b'} s1 = {"a", "b"} s2 = {"a", "b", "c"} # 子集 print(s1 < s2) # set1是set2的⼦子集吗? True print(s1.issubset(s2)) # 超集 print(s1 > s2) # set1是set2的超集吗? False print(s1.issuperset(s2))
3.深浅拷贝
3.1 引用赋值
直接赋值. 其实是把内存地址交给变量. 并不是复制一份内容. 所以.lst1的内存指向和lst2是一样的. lst1改变了, lst2也发生了改变
1 lst1 = ["a", "b", "c", "d"] 2 lst2 = lst1 3 4 print(lst1) # ['a', 'b', 'c', 'd'] 5 print(lst2) # ['a', 'b', 'c', 'd'] 6 lst1.append("e") 7 print(lst1) # ['a', 'b', 'c', 'd', 'e'] 8 print(lst2) # ['a', 'b', 'c', 'd', 'e']
3.2 浅拷贝
创建一个与已有的列表内容相同的另一个列表,有两种方法,一种是使用列表自带的copy()方法,另一种是使用切片.
#1
lst1 = ["何炅", "杜海涛","周渝民"] lst2 = lst1.copy()#列表自带的方法 lst1.append("李嘉诚") print(lst1) print(lst2) print(id(lst1), id(lst2)) 结果: 两个lst完全不一样. 内存地址和内容也不一样. 发现实现了内存的拷贝
#2 lst1 = ["何炅", "杜海涛","周渝民", ["麻花藤", "马芸", "周笔畅"]] lst2 = lst1[:]#使用切片来复制 lst1[3].append("无敌是多磨寂寞") print(lst1) print(lst2) print(id(lst1[3]), id(lst2[3])) 结果: ['何炅', '杜海涛', '周渝民', ['麻花藤', '马芸', '周笔畅', '无敌是多磨寂寞']] ['何炅', '杜海涛', '周渝民', ['麻花藤', '马芸', '周笔畅', '无敌是多磨寂寞']] 4417248328 4417248328
从第二部分可以看出,浅拷贝. 只会拷贝第一层. 第二层的内容不会拷贝. 所以被称为浅拷贝
3.3深拷贝
import copy lst1 = ["何炅", "杜海涛","周渝民", ["麻花藤", "马芸", "周笔畅"]] lst2 = copy.deepcopy(lst1) lst1[3].append("无敌是多磨寂寞") print(lst1) print(lst2) print(id(lst1[3]), id(lst2[3])) 结果: ['何炅', '杜海涛', '周渝民', ['麻花藤', '马芸', '周笔畅', '无敌是多磨寂寞']] ['何炅', '杜海涛', '周渝民', ['麻花藤', '马芸', '周笔畅']] 4447221448 4447233800
深度拷贝. 把元素内部的元素完全进行拷贝复制. 不会产生一个改变另一个跟着改变的问题
上一篇: python之路 -- 面向对象基础2
下一篇: 层级轮播图(animate)