集合是一种重要的数据类型,最主要的特点是天生去重。
一、在介绍集合之前,先介绍一下深拷贝和浅拷贝。
深拷贝:会重新开辟一个内存空间
浅拷贝:不会重新开辟内存空间
(1)我们看下面的例子:
l = [1,1,2,3,4,5,6,8] for i in l: if i%2!=0:#奇数删掉。每删掉一个,下标就会变一次 l.remove(i) print(l)
可以看出,这段代码想实现的功能是去除list里的基数,但是运行结果如下:
原因就是,每删除掉一个数,列表中元素的下标就会变化一次,但是i是一直增加的,导致达不到我们想要的效果。
(2)这个问题可以用下面的方法解决:
l = [1,1,2,3,4,5,6,8] l2 = [1,1,2,3,4,5,6,8] print('l内存地址为:',id(l)) print('l2内存地址为:',id(l2)) for i in l2:#l2下标不会变化,因此所有元素都可以取到 if i%2!=0: l.remove(i)#在l中删除对应的元素 print(l)
我们先看运行结果:
可以看到,这样能够去除list里的奇数。定义一个list l2,则为l2重新开辟了一个内存空间,这样删除l中的元素时,l2不受影响。
(3)那么有人会想,直接定义l2=l是不是也可以,答案是不可以。因为这样的话,l和l2指向了同一个内存地址,l发生变化,l2也会变化。
(4)用(2)中的方法可以解决这个问题,但是当list很长时,复制一遍很麻烦,容易发生错误,这时可以引入copy模块
可以看到,在l中增加元素,不会影响l2。
二、集合set
集合的特点:(1)去重;(2)无序的;(3)集合也用大括号{},和字典不同的是:集合里直接是元素,字典是key-value的格式。(4)集合可以取交集、并集、差集等。
1、集合的定义
集合有两种定义方法,用set()或者{}。下面的例子能够很好地看出集合的去重和无序特点。
2、交集、并集、差集、对称差集
(1)交集:两个集合相同的元素,用‘&’
下面例子中,s1中包含元素3,4,5,6,7,8,9,s2中包含元素1,2,3,4。相同的部分是3,4。
另外,不同类型的取交集,结果为空。
isdisjoint可以判断两个集合是否有交集,有交集返回False,没有交集返回True
(2)并集:把两个集合合并到一起,并去重,用‘|’或者union
(3)差集:取一个集合里有,另一个集合里没有的元素,用‘-’或者difference
s1 - s2,取s1里有,但是s2里没有的元素。
(4)对称差集:去掉2个集合里都有的元素。用'^'
3、集合的增删改查
4、小练习
输入密码,校验密码是否合法。密码必须包含大写字母、小写字母、数字和特殊符号。
import string nums_set = set(string.digits)#所有数字组成的集合 upper_set = set(string.ascii_uppercase)#所有大写字母组成的集合 lower_set = set(string.ascii_lowercase)#所有小写字母组成的集合 pun = set(string.punctuation)#所有特殊符号组成的集合 for i in range(5): pwd=input('请输入密码:').strip() pwd_set = set(pwd) if pwd_set & nums_set and pwd_set & upper_set and pwd_set & lower_set and pwd_set & pun: print('密码是合法的',pwd) else: print('密码必须包含大写字母、小写字母、数字和特殊字符')