Python 集合set

可变集合set

集合set是Python中一种基本数据类型,它分为可变集合(set)和不可变集合(frozenset)两种。类似于其他语言,集合是一个无序不重复元素集,包括创建集合set、向集合中添加元素、删除集合中的元素、求集合的交集、并集、差集等操作。下面就让我们一一来学习集合的这些知识吧。

1、set创建集合

set集合类需要的参数必须是迭代器类型的,如:序列、字典等,然后转换成无序不重复的元素集。由于集合是不重复的,所以可以对字符串、列表、元组进行去重操作。

1.1创建空集合

>>> l =  set()
>>> l
set([])
>>> ss = set([])
>>> ss
set([])
>>> st = set(())
>>> st
  •  

1.2 创建非空集合

集合中set括号中需要的参数的数据类型有:序列(包括字符串、列表、元组),字典或者是另一个集合,但是不能是数值类型,如int类型。

字符串做参数

>>> s = set('createSet')
>>> s
set(['a', 'c', 'e', 'S', 'r', 't'])
  •  

list做参数

>>> s1 = set([1,2,3,1,3,4,5])
>>> s1
set([1, 2, 3, 4, 5])
  •  

元组做参数

>>> s2 = set((1,2,3,4,1))
>>> s2
set([1, 2, 3, 4])
  •  

字典做参数

>>> s3 = set({1:2,2:3})
>>> s3
set([1, 2])
  •  

字典转set集合,需要注意的是,只取了字典的key,相当于将字典中的dict.keys()列表转成set集合。

set集合做参数

>>> s1
set([1, 2, 3, 4, 5])
>>> ss = set(s1)
>>> ss
set([1, 2, 3, 4, 5])
  •  

2、集合添加

集合的添加有两种方式,分别是add和update。但是它们在添加元素时是由区别的:

2.1 add()方法

是把要传入的元素作为一个整体添加到集合中,如:

>>> sTest = set('one')
>>> sTest
set(['e', 'o', 'n'])
#添加一个'two'元素,并查看结果
>>> sTest.add('two')
>>> sTest
set(['e', 'two', 'o', 'n'])
  •  

2.2 update()方法

是把要传入的元素拆分成单个字符,存于集合中,并去掉重复的字符。如:

>>> sTest
set(['e', 'two', 'o', 'n'])
>>> sTest.update('123')
>>> sTest
set(['e', 'two', 'o', 'n', '1', '3', '2'])
  •  

3、集合删除

集合的删除操作使用的方法跟列表是一样的,使用的也是remove方法。如:

>>> sTest
set(['e', 'two', 'o', 'n', '1', '3', '2'])
#删除集合中的元素'e'
>>> sTest.remove('e')
>>> sTest
set(['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 a
1 1
2 2
3 4
4 d
5 c
  •  

变量idx表示集合中元素i的索引。

5、集合与序列间转换

集合可以和序列之间的转换跟序列之间互转是一样的,唯一不同的就是序列转成集合后,重复的元素被去掉了。

5.1 集合与字符串转换

字符串转集合

>>> s = set('python')
>>> s
set(['h', 'o', 'n', 'p', 't', 'y'])
  •  

集合转字符串

>>> str(s)
"set(['h', 'o', 'n', 'p', 't', 'y'])"
  •  

需要注意的是,使用str()函数直接对集合转字符串,结果是集合的字符串形式。 
我们也可以使用字符串的连接函数join()函数,进行集合转字符串,但是这样得到的字符串种的元素也是无序的。

>>> s = set('python')
>>> s
set(['h', 'o', 'n', 'p', 't', 'y'])
>>> ''.join(s)
'honpty'
  •  

5.2 集合与list转换

list转set

>>> list1 = [1,2,3,3,4,5]
>>> sList = set(list1)
>>> sList
set([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)
>>> sTup
set([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元素,如果存在则删除;如果没找到,则什么也不做。

>>> sList
set([1, 2, 3, 4, 5])
>>> sList.discard(1)
>>> sList
set([2, 3, 4, 5])
  •  

6.2 pop()方法

函数原型: 
s.pop() 
参数说明: 
s:为set类型的变量 
函数作用: 
删除并返回set类型的s中的一个不确定的元素,如果为空引发KeyError错误。

>>> sList
set([2, 3, 4, 5])
>>> sList.pop()
2
>>> sList
set([3, 4, 5])
6.3 clear()
  •  

函数原型: 
s.clear() 
参数说明: 
s:set类型的变量 
函数作用: 
清空s集合中的所有元素

>>> sList
set([3, 4, 5])
>>> sList.clear()
>>> sList
set([])
  •  

7、集合的一些操作符

既然是集合,那就会遵循集合的一些操作方法,如求交集、并集、差集等。 
7.1 交集 
Python中求集合的交集使用的符号是“&”,返回连个集合的共同元素的集合,即集合的交集。

>>> st1 = set('python')
>>> st1
set(['h', 'o', 'n', 'p', 't', 'y'])
>>> st2 = set('htc')
>>> st2
set(['h', 'c', 't'])
>>> st1 & st2
set(['h', 't'])
  •  

7.2 并集(合集) 
Python中求集合的并集用的是符号“|”,返回的是两个集合所有的并去掉重复的元素的集合。

>>> st1
set(['h', 'o', 'n', 'p', 't', 'y'])
>>> st3 = set('two')
>>> st3
set(['o', 't', 'w'])
>>> st1 | st3
set(['p', 't', 'w', 'y', 'h', 'o', 'n'])
  •  

7.3 差集 
Python中差集使用的符号是减号“-”。

>>> st1
set(['1', '3', '2', '5', '4', '7', '6'])
>>> st2 = set('4589')
>>> st2
set(['9', '8', '5', '4'])
>>> st1 - st2
set(['1', '3', '2', '7', '6'])
  •  

返回的结果是在集合st1中但不在集合st2中的元素的集合。

7.4 集合的不同 
查看两个集合的不同之处,使用的difference函数,等价于差集。如: 
s1.difference(s3) 
这种不同指的是集合s3相对于集合s1,不同的地方,也就是所有在集合s1中,而不再集合s2中的的元素组成的新集合。

>>> s1
set([1, 2, 3, 4, 5])
>>> s2
set([1, 2, 3, 4])
>>> s1.difference(s2)
set([5])
>>> s3
set(['1', '8', '9', '5'])
>>> s1.difference(s3)
set([1, 2, 3, 4, 5])
  •  

8、集合的范围判断

集合可以使用大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)、不等于(!=)来判断某个集合是否完全包含于另一个集合,也可以使用子父集判断函数。 
定义三个集合s1,s2,s3:

>>> s1
set([1, 2, 3, 4, 5])
>>> s2
set([1, 2, 3, 4])
>>> s3
set(['1', '8', '9', '5'])
  •  

大于(>)或大于等于(>=)

>>> s1 > s2
True
>>> s1 > s3
False
>>> s1 >= s2
True
  •  

表示左边集合是否完全包含右边集合,如集合s1是否完全包含集合s2。 
小于(<)或 小于等于(<=)

>>> s2 < s1
True
>>> s1 < s3
False
>>> s3 < s1
False
  •  

表示左边的集合是否完全包含于右边的集合,如集合s1是否完全包含于集合s2。

等于(==)、不等于(!=)

>>> s1 == s2
False
>>> s2 == s3
False
>>> s1 != s2
True
  •  

判断两个集合是否完全相同。

9、集合的成员运算符

集合里也可以使用成员运算符,in和not in,判断某个对象是否是集合中的成员。

>>> s1
set([1, 2, 3, 4, 5])
>>> 1 in s1
True
>>> 6 in s1
False
>>> 2 not in s1
False
>>> 6 not in s1
True
  •  

10、集合拷贝

集合的拷贝函数是:copy()

>>> s1
set([1, 2, 3, 4, 5])
>>> sc = s1.copy()
>>> sc
set([1, 2, 3, 4, 5])
  •  

将集合s1拷贝一份并赋给变量sc。

11、求集合长度

跟序列一样,求集合的长度也是使用len()函数。

>>> s1
set([1, 2, 3, 4, 5])
>>> len(s1)
5
  •  

12、求集合的关系

12.1 a.issuperset(b) 
判断集合a是否是b的父集。

>>> s2
set([1, 2, 3, 4])
>>> s1
set([1, 2, 3, 4, 5])
>>> s1.issuperset(s2)
True
  •  

判断s1集合是否是集合s2的父集,是返回True,否则返回False。

12.2 b.issubset(a) 
判断b是否是a的子集。

>>> s2
set([1, 2, 3, 4])
>>> s1
set([1, 2, 3, 4, 5])
>>> s1.issubset(s2)
False
>>> s2.issubset(s1)
True
  •  

判断s2集合是否是集合s1的子集,是返回True,否则返回False。

不可变集合frozenset

Python中还有一种不可改变的集合,那就是frozenset,不像set集合,可以增加删除集合中的元素,该集合中的内容是不可改变的,类似于字符串、元组。

>>> f = frozenset()
>>> f
frozenset([])
>>> f = frozenset('asdf')
>>> f
frozenset(['a', 's', 'd', 'f'])
>>> f = frozenset([1,2,3,4])
>>> f
frozenset([1, 2, 3, 4])
>>> f = frozenset((1,2,3,4))
>>> f
frozenset([1, 2, 3, 4])
>>> f = frozenset({1:2, 'a':2, 'c':3})
>>> f
frozenset(['a', 1, 'c'])
  •  

如果试图改变不可变集合中的元素,就会报AttributeError错误。 
不可变集合,除了内容不能更改外,其他功能及操作跟可变集合set一样。 
注意: 
无论是可变集合还是不可变集合,参数除了支持字符、数字、还可以是汉字(要注意编码的问题),类等。

转自https://blog.csdn.net/SeeTheWorld518/article/details/48199125

猜你喜欢

转载自blog.csdn.net/codingforhaifeng/article/details/82191584
今日推荐