集合(set)是一个无序的不重复元素序列。
和数学中的集合概念一样,用来保存不重复的元素,即集合中的元素都是唯一的,互不相同。
集合的定义
可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
创建格式:
parame = {value01,value02,...} 或者 set(value)
从内容上看,集合中,只能存储不可变的数据类型,包括整形、浮点型、字符串、元组,无法存储列表、字典、集合这些可变的数据类型,否则 Python 解释器会抛出 TypeError 错误。比如说:
>>> {{'a':1}}
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
{{'a':1}}
TypeError: unhashable type: 'dict'
>>> {[1,2,3]}
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
{[1,2,3]}
TypeError: unhashable type: 'list'
>>> {{1,2,3}}
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
{{1,2,3}}
TypeError: unhashable type: 'set'
并且需要注意的是,数据必须保证是唯一的,因为集合对于每种数据元素,只会保留一份。例如:
>>> {1,2,1,(1,2,3),'c','c'}
{1, 2, 'c', (1, 2, 3)}
由于 Python 中的 set 集合是无序的,所以每次输出时元素的排序顺序可能都不相同。
Python 提供了 2 种创建 set 集合的方法,分别是使用 {} 创建和使用 set() 函数将列表、元组等类型数据转换为集合。
使用 {} 创建
在 Python 中,创建 set 集合可以像列表、元素和字典一样,直接将集合赋值给变量,从而实现创建集合的目的,其语法格式如下:
setname = {value01,value02,...}
其中,setname 表示集合的名称,value01、value02......,是集合的元素。
a = {1,'c',1,(1,2,3),'c'}
print(a) #{1, 'c', (1, 2, 3)}
set()函数创建集合
set() 函数为 Python 的内置函数,其功能是将字符串、列表、元组、range 对象等可迭代对象转换成集合。该函数的语法格式如下:
setname = set(iteration)
其中,iteration 就表示字符串、列表、元组、range 对象等数据。
set1 = set("python")
set2 = set([1,2,3,4,5])
set3 = set((1,2,3,4,5))
print("set1:",set1)
print("set2:",set2)
print("set3:",set3)
‘’'
set1: {'o', 't', 'h', 'p', 'n', 'y'}
set2: {1, 2, 3, 4, 5}
set3: {1, 2, 3, 4, 5}
‘''
注意,如果要创建空集合,只能使用 set() 函数实现。因为直接使用一对 {},Python 解释器会将其视为一个空字典。
集合的基本操作
访问集合元素
由于集合中的元素是无序的,因此无法向列表那样使用下标访问元素。Python 中,访问集合元素最常用的方法是使用循环结构,将集合中的数据逐一读取出来。
a = {1,'c',1,(1,2,3),'c'}
for ele in a:
print(ele,end=' ‘)
’’’
1 c (1, 2, 3)
‘’‘
删除集合
和其他序列类型一样,手动函数集合类型,也可以使用 del() 语句,例如:
a = {1,'c',1,(1,2,3),'c'}
print(a)
del(a)
print(a)
’’’
{1, 'c', (1, 2, 3)}
Traceback (most recent call last):
...
print(a)
NameError: name 'a' is not defined
‘''
增加元素
语法格式如下:
set.add(x)
将元素 x 添加到集合 set 中,如果元素已存在,则不进行任何操作。
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.add("Facebook")
>>> print(thisset)
{'Taobao', 'Facebook', 'Google', 'Runoob'}
还有一个方法,也可以添加元素,且参数可以是列表,元组,字典等,语法格式如下:
set.update(x)
x 可以有多个,用逗号分开。
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.update({1,3})
>>> print(thisset)
{1, 3, 'Google', 'Taobao', 'Runoob'}
>>> thisset.update([1,4],[5,6])
>>> print(thisset)
{1, 3, 4, 5, 6, 'Google', 'Taobao', 'Runoob'}
>>>
移除元素
语法格式如下:
set.remove(x)
将元素 x 从集合 set 中移除,如果元素不存在,则会发生错误。
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.remove("Taobao")
>>> print(thisset)
{'Google', 'Runoob'}
>>> thisset.remove("Facebook") # 不存在会发生错误
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Facebook'
>>>
此外还有一个方法也是移除集合中的元素,且如果元素不存在,不会发生错误。格式如下所示:
set.discard(x)
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.discard("Facebook") # 不存在不会发生错误
>>> print(thisset)
{'Taobao', 'Google', 'Runoob'}
也可以设置随机删除集合中的一个元素,语法格式如下:
set.pop(x)
thisset = set(("Google", "Runoob", "Taobao", "Facebook"))
x = thisset.pop()
print(x)
print(thisset)
‘’'
Facebook
{'Taobao', 'Google', 'Runoob’}
‘''
多次执行测试结果都不一样。
set 集合的 pop 方法会对集合进行无序的排列,然后将这个无序排列集合的左面第一个元素进行删除。如果集合为空,会引发 KeyError)
计算集合元素的个数
语法格式如下:
len(set)
计算集合 set 元素个数。
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> len(thisset)
3
清空集合
语法格式如下:
set.clear()
清空集合 set。
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.clear()
>>> print(thisset)
set()
判断元素是否在集合中存在
语法格式如下:
x in set
判断元素 x 是否在集合 set 中,存在返回 True,不存在返回 False。
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> "Runoob" in thisset
True
>>> "Facebook" in thisset
False
>>>
拷贝集合
copy 返回集合的浅拷贝。
>>> s = {1, 2, 3, 4, 5, 6}
>>> new_s = s.copy()
>>> new_s
{1, 2, 3, 4, 5, 6}
集合运算
子集
子集,为某个集合中一部分的集合,故亦称部分集合。
使用操作符 <
执行子集操作,同样地,也可使用方法 issubset() 完成。
>>> A = set('abcd')
>>> B = set('cdef')
>>> C = set("ab")
>>> C < A
True # C 是 A 的子集
>>> C < B
False
>>> C.issubset(A)
True
并集
一组集合的并集是这些集合的所有元素构成的集合,而不包含其他元素。
使用操作符 |
执行并集操作,同样地,也可使用方法 union() 完成。
>>> A | B
{'c', 'b', 'f', 'd', 'e', 'a'}
>>> A.union(B)
{'c', 'b', 'f', 'd', 'e', 'a'}
交集
两个集合 A 和 B 的交集是含有所有既属于 A 又属于 B 的元素,而没有其他元素的集合。
使用 &
操作符执行交集操作,同样地,也可使用方法 intersection() 完成。
>>> A & B
{'c', 'd'}
>>> A.intersection(B)
{'c', 'd'}
也可以计算多个集合的交集:
x = {"a", "b", "c"}
y = {"c", "d", "e"}
z = {"f", "g", "c"}
x.intersection_update(y, z)
print(x)
输出结果为:
{'c'}
差集
A 与 B 的差集是所有属于 A 且不属于 B 的元素构成的集合
使用操作符 -
执行差集操作,同样地,也可使用方法 difference() 完成。
>>> A - B
{'b', 'a'}
>>> A.difference(B)
{'b', 'a'}
对称差
两个集合的对称差是只属于其中一个集合,而不属于另一个集合的元素组成的集合。
使用 ^
操作符执行差集操作,同样地,也可使用方法 symmetric_difference() 完成。
>>> A ^ B
{'b', 'f', 'e', 'a'}
>>> A.symmetric_difference(B)
{'b', 'f', 'e', 'a'}
集合内置方法列表
方法 | 描述 |
add() | 为集合添加元素 |
clear() | 移除集合中的所有元素 |
copy() | 拷贝一个集合 |
difference() | 返回多个集合的差集 |
difference_update() | 移除集合中的元素,该元素在指定的集合也存在。 |
discard() | 删除集合中指定的元素 |
intersection() | 返回集合的交集 |
intersection_update() | 返回集合的交集。 |
isdisjoint() | 判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False。 |
issubset() | 判断指定集合是否为该方法参数集合的子集。 |
issuperset() | 判断该方法的参数集合是否为指定集合的子集 |
pop() | 随机移除元素 |
remove() | 移除指定元素 |
symmetric_difference() | 返回两个集合中不重复的元素集合。 |
symmetric_difference_update() | 移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中。 |
union() | 返回两个集合的并集 |
update() | 给集合添加元素 |
另外一些python内置函数也可以使用在集合上:
函数 | 描述 |
all() | 如果集合中的所有元素都是 True(或者集合为空),则返回 True。 |
any() | 如果集合中的所有元素都是 True,则返回 True;如果集合为空,则返回 False。 |
enumerate() | 返回一个枚举对象,其中包含了集合中所有元素的索引和值(配对)。 |
len() | 返回集合的长度(元素个数) |
max() | 返回集合中的最大项 |
min() | 返回集合中的最小项 |
sorted() | 从集合中的元素返回新的排序列表(不排序集合本身) |
sum() | 返回集合的所有元素之和 |
不可变集合frozenset
内置函数 frozenset([iterable]) 可构建不可变集合,称为冻结集合,返回一个新的 frozenset 对象,它包含可选参数 iterable 中的元素。 frozenset 是一个内置的类。
语法为 class frozenset([iterable])
,其中参数 iterable 是可选的,不传入时会创建一个空的冻结集合,传入时由 iterable 中的元素初始化。
参数
参数 iterable 是一个可迭代对象(比如列表、字典、元组、字符串等),将此对象转为一个冻结集合。如果不传则为一个空的冻结集合。
特性
冻结集合只是 Python 集合(set)对象的一个不可变版本。set 可以随时修改集合的元素,但冻结集合的元素在创建后保持不变。因此,冻结集可以用作字典中的键或另一个集合的元素。和集合一样,它不是有序的(元素不可以索引)。
作用
为什么需要冻结的集合(即不可变的集合)呢?因为在集合的关系中,有集合的中的元素是另一个集合的情况,但是普通集合(set)本身是可变的,那么它的实例就不能放在另一个集合中(set中的元素必须是不可变类型)。
所以,frozenset提供了不可变的集合的功能,当集合不可变时,它就满足了作为集合中的元素的要求,就可以放在另一个集合中了。
操作
冻结集合为一个不可变、无序对象,不对对其进行增加、修改、排序、下标切取等操作,但它也具有集合的一些特性,可以操作交差并补等集合的操作。
fs = frozenset([1,2,3])
fs
# frozenset({1, 2, 3})
fs.intersection([2,3,4]) # 交
# frozenset({2, 3})
fs.symmetric_difference([1,2]) # 差集(对称差)
# frozenset({3})
fs.union([2,3,4]) # 并
# frozenset({1, 2, 3, 4})
fs.isdisjoint([2,3,4]) # 是否空交集为空
# False
fs.issubset([1,2,3,4]) # 是否子集
# True
fs.issuperset([1,2]) # 是否超集
# True
# 浅拷贝
fs.copy() is fs
# True
由于它是一个容器类型,因此也支持取长度、最大值、返回重排序列等操作,可参考 集合 set。