在本文中,你将学习关于Python集的所有内容,如何创建、添加或删除元素以及在Python中对集合执行的所有操作。
Python中的集合是什么?
集合是项目的无序集合,每个元素都是唯一的(没有重复),并且必须是不可变的(不能更改)。
然而,集合本身是可变的,我们可以添加或删除其中的项。
集合可用于进行数学集合运算,如并、交、对称差分等。
如何创建一个集合?
通过将所有项(元素)放在花括号{}中,用逗号分隔或使用内置函数set()来创建集合。
它可以有任意数量的项目,它们可能是不同类型的(整数、浮点数、元组、字符串等)。但是一个集合不能有一个可变的元素,比如list、set或dictionary作为它的元素。
my_set = {1, 2, 3}
print(my_set)
my_set = {1.0, "Hello", (1, 2, 3)}
print(my_set)
也可以尝试以下示例。
# 集合没有重复元素
# 输出: {1, 2, 3, 4}
my_set = {1,2,3,4,3,2}
print(my_set)
# 集合不能有可变项
# 这里[3,4]是一个可变列表
# 使用这个列表会抛出一个错误
# TypeError: unhashable type: 'list'
#my_set = {1, 2, [3, 4]}
# 我们可以从列表中生成集合
# 输出: {1, 2, 3}
my_set = set([1,2,3,2])
print(my_set)
创建一个空集有点棘手。
空花括号{}将在Python中创建一个空字典,为了创建一个没有任何元素的集合,我们使用了没有任何参数的set()函数。
# 使用{}
a = {}
# 输出:
print(type(a))
# 使用set()
a = set()
# 输出:
print(type(a))
如何在Python中更改集合?
集是可变的,但是由于它们是无序的,索引就没有意义了。
我们不能使用索引或切片访问或更改set元素,Set不支持它。
我们可以使用add()方法添加单个元素,使用update()方法添加多个元素,update()方法的参数可以是元组、列表、字符串或其他集合,在所有情况下,应该避免重复。
# 初始化
my_set = {1,3}
print(my_set)
# 使用下面的代码会抛出一个错误
# TypeError: 'set' object does not support indexing
#my_set[0]
# 添加一个元素
# 输出: {1, 2, 3}
my_set.add(2)
print(my_set)
# 添加多个元素
# 输出: {1, 2, 3, 4}
my_set.update([2,3,4])
print(my_set)
# 输出: {1, 2, 3, 4, 5, 6, 8}
my_set.update([4,5], {1,6,8})
print(my_set)
如何从集合中删除元素?
可以使用方法discard
()和remove()从集合中删除特定项。
两者之间的惟一区别是,在使用discard ()时,如果这个项在集合中不存在,它将保持不变,但是remove()将在这种情况下引发错误。
下面的示例将对此进行说明。
my_set = {1, 3, 4, 5, 6}
print(my_set)
# 输出: {1, 3, 5, 6}
my_set.discard(4)
print(my_set)
# 输出: {1, 3, 5}
my_set.remove(6)
print(my_set)
# 输出: {1, 3, 5}
my_set.discard(2)
print(my_set)
# 使用以下代码会抛出一个错误
# 输出: KeyError: 2
#my_set.remove(2)
类似地,我们可以使用pop()方法删除和返回一个项。
设置为无序,无法确定哪一项将弹出,它是完全任意的。
我们还可以使用clear()从集合中删除所有项。
my_set = set("HelloWorld")
print(my_set)
# 输出: 随机元素
print(my_set.pop())
# 输出: random element
my_set.pop()
print(my_set)
#输出: set()
my_set.clear()
print(my_set)
Python集合操作
集合可用于进行并、交、差、对称差等数学集合运算,我们可以通过操作符或方法来实现。
让我们考虑以下两组用于以下操作的集合。
>>> A = {1, 2, 3, 4, 5}
>>> B = {4, 5, 6, 7, 8}
集合的并集
A和B的并集是来自这两个集合的所有元素的集合。
Union是使用|操作符执行的,也可以使用union()方法来完成。
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}
# 输出: {1, 2, 3, 4, 5, 6, 7, 8}
print(A | B)
在Python
shell上尝试以下示例。
>>> A.union(B)
{1, 2, 3, 4, 5, 6, 7, 8}
>>> B.union(A)
{1, 2, 3, 4, 5, 6, 7, 8}
集合的交集
A和B的交集是两个集合中共同的一组元素。
交集使用&运算符执行,可以使用交集()方法来完成相同的任务。
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}
# 输出: {4, 5}
print(A & B)
在Python
shell上尝试以下示例。
>>> A.intersection(B)
{4, 5}
>>> B.intersection(A)
{4, 5}
集合的差集
A和B的区别(A – B)是只在A中而不在B中存在的一组元素。
差集是用-运算符来执行的,可以使用方法difference()实现相同的功能。
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}
# 输出: {1, 2, 3}
print(A - B)
在Python
shell上尝试以下示例。
>>> A.difference(B)
{1, 2, 3}
>>> B - A
{8, 6, 7}
>>> B.difference(A)
{8, 6, 7}
集合的对称差分
A和B的对称差分是A和B中的一组元素,除了它们是共同的。
对称差分是使用^运算符来实现的,可以使用symmetric_difference()方法来完成相同的工作。
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}
# 输出: {1, 2, 3, 6, 7, 8}
print(A ^ B)
在Python
shell上尝试以下示例。
>>> A.symmetric_difference(B)
{1, 2, 3, 6, 7, 8}
>>> B.symmetric_difference(A)
{1, 2, 3, 6, 7, 8}
不同的Python集合方法
有许多set方法,其中一些我们已经在上面使用过,下面是set对象中可用的所有方法的列表。
Python集合方法
方法描述
add()将元素添加到集合中
clear()从集合中移除所有元素
copy()返回集合的副本
difference()将两个或多个集合的差作为一个新集合返回
difference_update()从这个集合中移除另一个集合的所有元素
discard()如果元素是成员,则从集合中移除该元素。(如果元素不在集合中,则不执行任何操作)
intersection()以新集合的形式返回两个集合的交集
intersection_update()用自身与他人的交集更新集合
isdisjoint()如果两个集合的交集为空,则返回True
issubset()如果另一个集合包含此集合,则返回True
issuperset()如果这个集合包含另一个集合,则返回True
pop()移除并返回任意的集合元素。如果集合为空,则引发KeyError
remove()从集合中移除一个元素。如果该元素不是成员,则引发密钥错误
symmetric_difference()将两个集合的对称差作为一个新集合返回
symmetric_difference_update()更新具有自身和他人的对称差异的集合
union()返回新集合中集合的并集
update()用自身和其他的并集更新集合
其他集合的操作
集合成员测试
我们可以使用关键字in来测试一个项是否存在于一个集合中。
my_set = set("apple")
# 输出: True
print('a' in my_set)
# 输出: False
print('p' not in my_set)
遍历一个集合
使用for循环,我们可以遍历集合中的每个项。
>>> for letter in set("apple"):
... print(letter)
...
a
p
e
l
集合的内置函数
内置函数如all()、any()、enumerate()、len()、max()、min()、sort()、sum()等常用来执行不同的任务。
集合的内置函数
函数说明
all()如果集合的所有元素都为真(或者集合为空),则返回True。
any()如果集合中的任何元素为真,则返回真。如果集合为空,则返回False。
enumerate()返回一个枚举对象。它将集合的所有项的索引和值作为一对包含。
len()返回集合中的长度(项数)。
max()返回集合中最大的项。
min()返回集合中最小的项。
sorted()从集合中的元素返回一个新的排序列表(不对集合本身排序)。
sum()重新调整集合中所有元素的和。
Python冻结集Frozenset
Frozenset是一个新类,它有一组的特点,但其分配元素无法改变一次,元组是不可变的列表,frozensets则是不可变的集合。
可变的集合不可散列化,所以他们不能被用作字典键,另一方面frozensets 是可散列的,并且可以作为字典的关键。
Frozensets可以使用函数frozenset ()创建。
这个数据类型支持方法像copy(),
difference(), intersection(), isdisjoint(), issubset(), issuperset(), symmetric_difference()
和union(),若是不可变的则不支持添加或删除元素。
A = frozenset([1, 2, 3, 4])
B = frozenset([3, 4, 5, 6])
在Python
shell上尝试这些示例。
>>> A.isdisjoint(B)
False
>>> A.difference(B)
frozenset({1, 2})
>>> A | B
frozenset({1, 2, 3, 4, 5, 6})
>>> A.add(3)
...
AttributeError: 'frozenset' object has no attribute 'add'