Python 集合set

来源:互联网 发布:淘宝手机店铺宝贝分类 编辑:程序博客网 时间:2024/05/17 07:59

可变集合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一样。
注意:
无论是可变集合还是不可变集合,参数除了支持字符、数字、还可以是汉字(要注意编码的问题),类等。

0 0