集合(set)是Python2.4引入的一种新类型。集合常量与字典类似,用花括号表示,如{1,2,3}。几何中的元素是唯一的、无序的和不可改变的。集合支持数学理论中的各种集合运算。
集合常量
集合常量用为字典对象的花括号表示,也可用内置的set函数来创建。例如:
>>> x={1,2,3} #直接使用集合常量
>>> x
{1, 2, 3}
>>> type(x)
<class 'set'>
>>> set({1,2,3}) #使用集合常量做常量创建对象对象
{1, 2, 3}
>>> set([1,2,3]) #使用列表常量做参数创建集合对象
{1, 2, 3}
>>> set('123abc') #使用字符串常量做参数创建集合常量
{'b', 'a', '2', '3', '1', 'c'}
>>> set() #创建空集合
set()
>>> type({}) #{}表示空字典对象,而非空集合
<class 'dict'>
>>> {1,1,2,3} #创建集合对象时会自动删除重复值
{1, 2, 3}
>>> set({1,2,2,3,3})
{1, 2, 3}
>>>
Python3.0还引入了一种集合解析构造方法。例如
>>> {x for x in [1,2,3,4]}
{1, 2, 3, 4}
>>> {x for x in 'abcddd'}
{'a', 'b', 'c', 'd'}
>>>
上面分别使用了列表和字符串的解析方式来创建集合。还可以进一步用解析对象的表达式来创建集合元素。例如:
>>> {x**2 for x in [1,2,3,4]} #解析列表的元素用来创建集合
{16, 1, 4, 9}
>>> {x*2 for x in 'abcd'} #解析字符串的元素用来创建集合
{'dd', 'bb', 'aa', 'cc'}
集合运算
集合对象支持下列运算
>>> x={1,2,'a', 'bc'}
>>> y={1,'a',5}
>>> len(x) #求集合中元素的个数
4
>>> 'a' in x #判断元素是否属于集合
True
>>> x-y #求差集
{2, 'bc'}
>>> x | y #求并集
{1, 2, 5, 'a', 'bc'}
>>> x & y #求交集
{1, 'a'}
>>> x^y #求对称差,即:(x|y)-(x&y)
{2, 5, 'bc'}
>>> x<y #判断x是否是y的子集
False
>>> x>{1,2} #判断x是否是{x,y}的超集
True
集合基本操作
集合中的元素是不能进行修改的,但可以为集合添加或删除元素。例如:
>>> x={1,2}
>>> x
{1, 2}
>>> y=x.copy() #复制集合对象
>>> y
{1, 2}
>>> x.add('abc') #为集合添加一个元素,参数为元素
>>> x,y #上述复制为对象的复制,而非引用的复制
({1, 2, 'abc'}, {1, 2})
>>> x.update({10,20}) #为集合添加多个元素,参数为集合,若为列表或字符串,会被解析成多个元素
>>> x
{1, 2, 10, 'abc', 20}
>>> x.remove(10) #从集合中删除指定元素,元素不存在则报KeyError异常
>>> x
{1, 2, 'abc', 20}
>>> x.discard(20) #从结合中删除指定元素,元素不存在不报异常
>>> x
{1, 2, 'abc'}
>>> x.pop() #从集合中随机删除一个元素,并返回该元素
1
>>> x
{2, 'abc'}
>>> x.clear() #删除集合中的全部元素
>>> x
set()
>>>
集合也可用for循环执行迭代操作。例如:
>>> x={1,2,3}
>>> for a in x:print(a) #用循环迭代集合中的元素
...
1
2
3
>>>
几何元素是不可改变的,因此不能将可变对象放入集合中。集合、列表和字典对象均不能加入集合。元组可以作为一个元素加入几何。例如:
>>> x={1,2}
>>> x
{1, 2}
>>> x.({1}) #集合不能放入集合
File "<stdin>", line 1
x.({1})
^
SyntaxError: invalid syntax
>>> x.add([1,2,3]) #列表不能放入集合
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> x.add({'Mon':1}) #字典对象不能放入集合
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> x.add((1,2,3)) #元组可以放入集合
>>> x
{1, 2, (1, 2, 3)}
>>>
冻结集合
在前面的内容中,已用到的集合可以添加或删除集合元素。Python提供了一种特殊的集合--冻结集合(frozenset)。冻结集合是一个不可改变的集合,可以作为其他集合的元素。
例如:
>>> x=frozenset([1,2,3]) #创建冻结集合
>>> x
frozenset({1, 2, 3}) #冻结集合的打印格式与普通集合不同
>>> y=set([4,5])
>>> y
{4, 5}
>>> y.add(x) #将冻结集合作为元素加入另一个集合
>>> y
{frozenset({1, 2, 3}), 4, 5}
>>> x.add(10) #试图为冻结集合添加元素发生错误
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'add'
>>>
from: Python3基础教程