python_day6(集合)
集合set
集合在后续工作中用的比较少。
集合的特点
1、可变数据类型;
2、集合中的元素必须都是不可变的数据类型;
3、集合中的元素都是无序的
4、集合中的元素不重复,这点很重要,可以用来做去重
set2={1,2,'barry',[1,2,3]} print(set2) D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/14.py Traceback (most recent call last): File "F:/python/python学习/人工智能/第一阶段day2/14.py", line 1, in <module> set2={1,2,'barry',[1,2,3]} TypeError: unhashable type: 'list' Process finished with exit code 1
如上代码所示,集合中含有可变的数据类型列表,所以结果报错
集合的创建方法
方法一
set1=set({1,3})#推荐使用第一种 set2=set([1,3]) print(set1) print(set2) D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/14.py {1, 3} {1, 3} Process finished with exit code 0
如上代码所示,都是圆括号中嵌套一个方括号和大括号都行,但是一般推荐使用小括号里面嵌套大括号。
其次是,集合和字典很类似,都是使用大括号包括起来,但是与字典相比,集合中没有键值对
方法二
set2={1,2,'barry'} print(set2)
集合的方法
与其他数据类型类似,集合也有增、删、查三种方法,但是由于集合中的元素是不可变的,所有集合没有改这个方法
集合的增(add和update两种方法)
set1 = {'alex','wusir','ritian','egon','barry'} #直接用add set1.add('girl') print(set1) #利用update方法,类似列表中的extend方法,这是迭代增加的 set2 = {'alex','wusir','ritian','egon','barry'} set2.update('abs') print(set2)#运行结果可看出增加的结果是无序的 D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/14.py {'ritian', 'alex', 'barry', 'wusir', 'girl', 'egon'} {'ritian', 'alex', 'barry', 's', 'wusir', 'a', 'b', 'egon'} Process finished with exit code 0
集合的删
set1 = {'alex','wusir','ritian','egon','barry'} set1.pop() print(set1)#也是随机删除,但是pop方法有返回值
按照元素来删除
set1 = {'alex','wusir','ritian','egon','barry'} set1.remove('alex') print(set1)#没有返回值
清除集合中的元素
set1 = {'alex','wusir','ritian','egon','barry'} set1.clear() print(set1)#没有返回值 D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/14.py set() Process finished with exit code 0
注意,运行上面的代码后,结果不是{},而是以set()来表示空的集合,这是因为{}一般用来表示空字典,以免混淆
删除这个集合
set1 = {'alex','wusir','ritian','egon','barry'} del set1 print(set1)#没有返回值 D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/14.py Traceback (most recent call last): File "F:/python/python学习/人工智能/第一阶段day2/14.py", line 3, in <module> print(set1)#没有返回值 NameError: name 'set1' is not defined Process finished with exit code 1
集合的查
因为集合没有键值对,没有索引,且集合中的元素是无序的,所以集合的查询只能使用for循环
set1 = {'alex','wusir','ritian','egon','barry'} for i in set1: print(i)
集合的其他操作
交集
set1={1,2,3,4} set2={3,4,5,6} print(set1 & set2) print(set1.intersection(set2))
并集
set1={1,2,3,4} set2={3,4,5,6} print(set1 | set2) print(set1.union(set2))
反交集(除了共有元素以外都算)
set1={1,2,3,4} set2={3,4,5,6} print(set1 ^ set2) print(set1.symmetric_difference(set2))
差集
set1={1,2,3,4} set2={3,4,5,6} print(set1 - set2)#set1中独有,set2中没有 print(set1.difference(set2))
子集
set1 = {1,2,3} set2 = {1,2,3,4,5,6} print(set1< set2) print(set1.issubset(set2))
超集
set1 = {1,2,3} set2 = {1,2,3,4,5,6} print(set2>set1) print(set2.issuperset(set1))
集合和列表之间的转换
可以利用集合中元素不能重合的特点,对列表中重合的元素进行去重
li=[1,1,2,2,4,5,8,8,8,9,5,6,44,2,5] set1=set(li)#将列表转换为集合 print(set1) li2=list(set1)#将集合转换为列表 print(li2) D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/14.py {1, 2, 4, 5, 6, 8, 9, 44} [1, 2, 4, 5, 6, 8, 9, 44] Process finished with exit code 0
集合由可变数据类型变为不可变数据类型
s=set('barry') print(s,type(s)) s1=frozenset('barry')#由可变的数据类型,变为不可变的数据类型,可以利用for循环执行查找,但是不能执行增、删等操作 print(s1,type(s1)) D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/14.py {'y', 'r', 'b', 'a'} <class 'set'> frozenset({'y', 'r', 'b', 'a'}) <class 'frozenset'> Process finished with exit code 0