Python学习 - 第7天(集合)
1、集合:
集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:
a)去重,把一个列表变成集合,就自动去重了。
b)关系测试,测试两组数据之前的交集、差集、并集等关系。
2、集合的创建
set1 = set({1,2,'barry'}) set2 = {1,2,'barry'} print(set1,set2) # {1, 2, 'barry'} {1, 2, 'barry'}
3、集合的增(add,update)
add:随机添加
set1 = {'罗伊人','林拜','熊青春','白力勤','陈香'} set1.add('郑秋冬') print(set1)
update:迭代增加,随机
set1 = set() set1.update('郑秋冬') print(set1) set1.update(['罗伊人','熊青春','贾衣玫']) print(set1)
4、集合的删(remove(),pop(),clear(),del)
set1 = {'郑秋冬','罗伊人','熊青春','贾衣玫','林拜','白力勤','袁昆'} set1.remove('白力勤') print(set1) print(set1.pop(),set1) set1.clear() print(set1) del set1 print(set1)
5、集合的查(for循环)
set1 = {'郑秋冬','罗伊人','熊青春','贾衣玫','林拜','白力勤','袁昆'} for i in set1: print(i)
6、集合的其他操作
1)交集( & intersection)
set1 = {'郑秋冬','罗伊人','熊青春','贾衣玫','林拜','白力勤','袁昆'} set2 = {'罗伊人','熊青春','贾衣玫','冯眷眷','周淮兰','简娜','周霜荷'} print(set1 & set2) print(set1.intersection(set2)) # {'罗伊人', '熊青春', '贾衣玫'}
2)并集( | union)
set1 = {'郑秋冬','罗伊人','熊青春','贾衣玫','林拜','白力勤','袁昆'} set2 = {'罗伊人','熊青春','贾衣玫','冯眷眷','周淮兰','简娜','周霜荷'} print(set1 | set2) print(set1,set2,set2.union(set1))
3)差集( - difference)
set1 = {'郑秋冬','罗伊人','熊青春','贾衣玫','林拜','白力勤','袁昆'} set2 = {'罗伊人','熊青春','贾衣玫','冯眷眷','周淮兰','简娜','周霜荷'} print(set1 - set2) print(set1.difference(set2))
4)反交集( ^ symmetric_difference)
set1 = {'郑秋冬','罗伊人','熊青春','贾衣玫','林拜','白力勤','袁昆'} set2 = {'罗伊人','熊青春','贾衣玫','冯眷眷','周淮兰','简娜','周霜荷'} print(set1 ^ set2) print(set1.symmetric_difference(set2))
5)子集与超级
set1 = {'罗伊人','熊青春','贾衣玫'} set2 = {'罗伊人','熊青春','贾衣玫','冯眷眷','周淮兰','简娜','周霜荷'} print(set1 < set2) print(set1.issubset(set2)) # 这两个相同,都是说明set1是set2子集。 print(set2 > set1) print(set2.issuperset(set1)) # 这两个相同,都是说明set2是set1超集。
6)frozenset不可变集合,让集合变成不可变类型。
s = frozenset('barry') print(s,type(s))
7、深浅copy
1)赋值运算
对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的。
l1 = [1,2,3,['barry','alex']] l2 = l1 l1[0] = 111 print(l1) # [111, 2, 3, ['barry', 'alex']] print(l2) # [111, 2, 3, ['barry', 'alex']] l1[3][0] = 'wusir' print(l1) # [111, 2, 3, ['wusir', 'alex']] print(l2) # [111, 2, 3, ['wusir', 'alex']]
2)浅拷贝copy
对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。
l1 = [1,2,3,['barry','alex']] l2 = l1.copy() print(l1,id(l1)) # [1, 2, 3, ['barry', 'alex']] 2794248428424 print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2794248428616 l1[1] = 222 print(l1,id(l1)) # [1, 222, 3, ['barry', 'alex']] 2794248428424 l1[3][0] = 'wusir' print(l1,id(l1[3])) # [1, 222, 3, ['wusir', 'alex']] 2794248428680 print(l2,id(l2[3])) # [1, 2, 3, ['wusir', 'alex']] 2794248428680
3)深拷贝deepcopy
对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。
import copy l1 = [1,2,3,['barry','alex']] l2 = copy.deepcopy(l1) print(l1,id(l1)) # [1, 2, 3, ['barry', 'alex']] 2792837924552 print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2792837926088 l1[1] = 222 print(l1,id(l1)) # [1, 222, 3, ['barry', 'alex']] 2792837924552 print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2792837926088 l1[3][0] = 'wusir' print(l1,id(l1[3])) # [1, 222, 3, ['wusir', 'alex']] 2792837897224 print(l2,id(l2[3])) # [1, 2, 3, ['barry', 'alex']] 2792837935496