Python-集合

集合是一种重要的数据类型,最主要的特点是天生去重。

一、在介绍集合之前,先介绍一下深拷贝和浅拷贝。

深拷贝:会重新开辟一个内存空间

浅拷贝:不会重新开辟内存空间

(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('密码必须包含大写字母、小写字母、数字和特殊字符')
原文地址:https://www.cnblogs.com/zhxwind/p/8780874.html