本文共 5343 字,大约阅读时间需要 17 分钟。
可变集合set
集合set是Python中一种基本数据类型,它分为可变集合(set)和不可变集合(frozenset)两种。类似于其他语言,集合是一个无序不重复元素集,包括创建集合set、向集合中添加元素、删除集合中的元素、求集合的交集、并集、差集等操作。下面就让我们一一来学习集合的这些知识吧。
1、set创建集合
set集合类需要的参数必须是迭代器类型的,如:序列、字典等,然后转换成无序不重复的元素集。由于集合是不重复的,所以可以对字符串、列表、元组进行去重操作。
1.1创建空集合
>>> l = set()>>> lset([])>>> ss = set([])>>> ssset([])>>> st = set(())>>> st
1.2 创建非空集合
集合中set括号中需要的参数的数据类型有:序列(包括字符串、列表、元组),字典或者是另一个集合,但是不能是数值类型,如int类型。
字符串做参数
>>> s = set('createSet')>>> sset(['a', 'c', 'e', 'S', 'r', 't'])
list做参数
>>> s1 = set([1,2,3,1,3,4,5])>>> s1set([1, 2, 3, 4, 5])
元组做参数
>>> s2 = set((1,2,3,4,1))>>> s2set([1, 2, 3, 4])
字典做参数
>>> s3 = set({ 1:2,2:3})>>> s3set([1, 2])
字典转set集合,需要注意的是,只取了字典的key,相当于将字典中的dict.keys()列表转成set集合。
set集合做参数
>>> s1set([1, 2, 3, 4, 5])>>> ss = set(s1)>>> ssset([1, 2, 3, 4, 5])
2、集合添加
集合的添加有两种方式,分别是add和update。但是它们在添加元素时是由区别的:
2.1 add()方法
是把要传入的元素作为一个整体添加到集合中,如:
>>> sTest = set('one')>>> sTestset(['e', 'o', 'n'])#添加一个'two'元素,并查看结果>>> sTest.add('two')>>> sTestset(['e', 'two', 'o', 'n'])
2.2 update()方法
是把要传入的元素拆分成单个字符,存于集合中,并去掉重复的字符。如:
>>> sTestset(['e', 'two', 'o', 'n'])>>> sTest.update('123')>>> sTestset(['e', 'two', 'o', 'n', '1', '3', '2'])
3、集合删除
集合的删除操作使用的方法跟列表是一样的,使用的也是remove方法。如:
>>> sTestset(['e', 'two', 'o', 'n', '1', '3', '2'])#删除集合中的元素'e'>>> sTest.remove('e')>>> sTestset(['two', 'o', 'n', '1', '3', '2'])
4、集合的遍历
集合的遍历跟序列的遍历方法完全一样。>>> st = set([1,2,'a','c',4,'d'])>>> for i in st :... print i,...a 1 2 4 d c
另一种遍历方式:
>>> for idx, i in enumerate(st) :... print idx, i...0 a1 12 23 44 d5 c
变量idx表示集合中元素i的索引。
5、集合与序列间转换
集合可以和序列之间的转换跟序列之间互转是一样的,唯一不同的就是序列转成集合后,重复的元素被去掉了。
5.1 集合与字符串转换
字符串转集合
>>> s = set('python')>>> sset(['h', 'o', 'n', 'p', 't', 'y'])
集合转字符串
>>> str(s)"set(['h', 'o', 'n', 'p', 't', 'y'])"
需要注意的是,使用str()函数直接对集合转字符串,结果是集合的字符串形式。
我们也可以使用字符串的连接函数join()函数,进行集合转字符串,但是这样得到的字符串种的元素也是无序的。>>> s = set('python')>>> sset(['h', 'o', 'n', 'p', 't', 'y'])>>> ''.join(s)'honpty'
5.2 集合与list转换
list转set
>>> list1 = [1,2,3,3,4,5]>>> sList = set(list1)>>> sListset([1, 2, 3, 4, 5])
set转list
>>> list2 = list(sList)>>> list2[1, 2, 3, 4, 5]
集合转list结果是得到一个去重后的list,这种去重比用之前讲过的利用字典key唯一和利用list自身特定去重的方法都要简单快捷。
5.3 集合转元组
tuple转set
>>> tup = (1,2,3,3,45,6)>>> sTup = set(tup)>>> sTupset([1, 2, 3, 45, 6])
set转tuple
>>> tup1 = tuple(sTup)>>> tup1(1, 2, 3, 45, 6)
set转tuple后,得到的元组也是去重后的元组。
6、集合其他常用方法
6.1 discard()
函数原型: setVar.discard(element)参数说明:
setVar :为一个set类型的变量 element :表示要查找并删除的元素 函数作用:在集合setVar中查找element元素,如果存在则删除;如果没找到,则什么也不做。
>>> sListset([1, 2, 3, 4, 5])>>> sList.discard(1)>>> sListset([2, 3, 4, 5])
6.2 pop()方法
函数原型:
s.pop() 参数说明: s:为set类型的变量 函数作用: 删除并返回set类型的s中的一个不确定的元素,如果为空引发KeyError错误。>>> sListset([2, 3, 4, 5])>>> sList.pop()2>>> sListset([3, 4, 5])6.3 clear()
函数原型:
s.clear() 参数说明: s:set类型的变量 函数作用: 清空s集合中的所有元素>>> sListset([3, 4, 5])>>> sList.clear()>>> sListset([])
7、集合的一些操作符
既然是集合,那就会遵循集合的一些操作方法,如求交集、并集、差集等。
7.1 交集 Python中求集合的交集使用的符号是“&”,返回连个集合的共同元素的集合,即集合的交集。>>> st1 = set('python')>>> st1set(['h', 'o', 'n', 'p', 't', 'y'])>>> st2 = set('htc')>>> st2set(['h', 'c', 't'])>>> st1 & st2set(['h', 't'])
7.2 并集(合集)
Python中求集合的并集用的是符号“|”,返回的是两个集合所有的并去掉重复的元素的集合。>>> st1set(['h', 'o', 'n', 'p', 't', 'y'])>>> st3 = set('two')>>> st3set(['o', 't', 'w'])>>> st1 | st3set(['p', 't', 'w', 'y', 'h', 'o', 'n'])
7.3 差集
Python中差集使用的符号是减号“-”。>>> st1set(['1', '3', '2', '5', '4', '7', '6'])>>> st2 = set('4589')>>> st2set(['9', '8', '5', '4'])>>> st1 - st2set(['1', '3', '2', '7', '6'])
返回的结果是在集合st1中但不在集合st2中的元素的集合。
7.4 集合的不同
查看两个集合的不同之处,使用的difference函数,等价于差集。如: s1.difference(s3) 这种不同指的是集合s3相对于集合s1,不同的地方,也就是所有在集合s1中,而不再集合s2中的的元素组成的新集合。>>> s1set([1, 2, 3, 4, 5])>>> s2set([1, 2, 3, 4])>>> s1.difference(s2)set([5])>>> s3set(['1', '8', '9', '5'])>>> s1.difference(s3)set([1, 2, 3, 4, 5])
8、集合的范围判断
集合可以使用大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)、不等于(!=)来判断某个集合是否完全包含于另一个集合,也可以使用子父集判断函数。
定义三个集合s1,s2,s3:>>> s1set([1, 2, 3, 4, 5])>>> s2set([1, 2, 3, 4])>>> s3set(['1', '8', '9', '5'])
大于(>)或大于等于(>=)
>>> s1 > s2True>>> s1 > s3False>>> s1 >= s2True
表示左边集合是否完全包含右边集合,如集合s1是否完全包含集合s2。
小于(<)或 小于等于(<=)>>> s2 < s1True>>> s1 < s3False>>> s3 < s1False
表示左边的集合是否完全包含于右边的集合,如集合s1是否完全包含于集合s2。
等于(==)、不等于(!=)
>>> s1 == s2False>>> s2 == s3False>>> s1 != s2True
判断两个集合是否完全相同。
9、集合的成员运算符
集合里也可以使用成员运算符,in和not in,判断某个对象是否是集合中的成员。
>>> s1set([1, 2, 3, 4, 5])>>> 1 in s1True>>> 6 in s1False>>> 2 not in s1False>>> 6 not in s1True
10、集合拷贝
集合的拷贝函数是:copy()
>>> s1set([1, 2, 3, 4, 5])>>> sc = s1.copy()>>> scset([1, 2, 3, 4, 5])
将集合s1拷贝一份并赋给变量sc。
11、求集合长度
跟序列一样,求集合的长度也是使用len()函数。
>>> s1set([1, 2, 3, 4, 5])>>> len(s1)5
12、求集合的关系
12.1 a.issuperset(b)
判断集合a是否是b的父集。>>> s2set([1, 2, 3, 4])>>> s1set([1, 2, 3, 4, 5])>>> s1.issuperset(s2)True
判断s1集合是否是集合s2的父集,是返回True,否则返回False。
12.2 b.issubset(a)
判断b是否是a的子集。>>> s2set([1, 2, 3, 4])>>> s1set([1, 2, 3, 4, 5])>>> s1.issubset(s2)False>>> s2.issubset(s1)True
判断s2集合是否是集合s1的子集,是返回True,否则返回False。
不可变集合frozenset
Python中还有一种不可改变的集合,那就是frozenset,不像set集合,可以增加删除集合中的元素,该集合中的内容是不可改变的,类似于字符串、元组。
>>> f = frozenset()>>> ffrozenset([])>>> f = frozenset('asdf')>>> ffrozenset(['a', 's', 'd', 'f'])>>> f = frozenset([1,2,3,4])>>> ffrozenset([1, 2, 3, 4])>>> f = frozenset((1,2,3,4))>>> ffrozenset([1, 2, 3, 4])>>> f = frozenset({ 1:2, 'a':2, 'c':3})>>> ffrozenset(['a', 1, 'c'])
如果试图改变不可变集合中的元素,就会报AttributeError错误。
不可变集合,除了内容不能更改外,其他功能及操作跟可变集合set一样。 注意: 无论是可变集合还是不可变集合,参数除了支持字符、数字、还可以是汉字(要注意编码的问题),类等。转载地址:http://qdmdi.baihongyu.com/