在本文中,您将学习关于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) #set不能包含可变项 #这里[3,4]是可变列表 #如果您取消注释第12行, #这将导致错误。 # 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 = {} # 检查a的数据类型 # 输出: <class 'dict'> print(type(a)) # 初始化使用 set() a = set() # 检查a的数据类型 # 输出: <class 'set'> print(type(a))
集是可变的。但是由于它们是无序的,因此索引没有意义。
我们无法使用索引或切片来访问或更改集合的元素。集不支持它。
我们可以使用add()方法添加单个元素,使用update()方法添加多个元素。update()方法可以采用元组,列表,字符串或其他集合作为其参数。在所有情况下,都避免重复。
# 初始化 my_set my_set = {1,3} print(my_set) # 如果取消注释第9行, # 你会得到一个错误 # 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) # 增加 list 和set # 输出: {1, 2, 3, 4, 5, 6, 8} my_set.update([4,5], {1,6,8}) print(my_set)
运行该程序时,输出为:
{1, 3} {1, 2, 3} {1, 2, 3, 4} {1, 2, 3, 4, 5, 6, 8}
可以使用discard()和remove()方法从集合中删除特定项目。
两者之间的唯一区别是,如果使用discard(),而项目不存在于集合中,则它保持不变。但是remove()在这种情况下会引发错误。
以下示例将说明这一点。
# 初始化 my_set 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) # 抛弃一个元素 # 没有出现在 my_set # 输出: {1, 3, 5} my_set.discard(2) print(my_set) # remove一个元素 # 没有出现在 my_set # 如果没有注释#my_set.remove(2), # 会抛出一个错误. # Output: KeyError: 2 #my_set.remove(2)
同样,我们可以使用pop()方法删除并返回一个项目。
集合为无序,无法确定将弹出哪个项目。这是完全任意的。
我们还可以使用clear()方法删除集合中的所有项目。
# 初始化 my_set # 输出: 唯一元素集 my_set = set("HelloWorld") print(my_set) # pop一个元素 # 输出: 随机元素 print(my_set.pop()) # pop 任意元素 # Output:随机元素 my_set.pop() print(my_set) # 清空 my_set #输出: set() my_set.clear() print(my_set)
集合可用于执行数学集合运算,例如并集,交集,差和对称差。我们可以通过运算符或方法来实现。。
让我们考虑以下两组用于以下操作。
>>> A = {1, 2, 3, 4, 5} >>> B = {4, 5, 6, 7, 8}
A和B的并集是来自这两个集合的所有元素的集合。
并集是使用|操作符执行的。也可以使用union()方法来完成。
# 初始化 A 和 B 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上尝试以下示例。
# 使用union 函数 >>> A.union(B) {1, 2, 3, 4, 5, 6, 7, 8} # 在B上使用并集函数 >>> B.union(A) {1, 2, 3, 4, 5, 6, 7, 8}
A和B的交集是在这两个集合中共有的一组元素。
交点使用&运算符执行。使用intersection()方法可以完成相同的操作。
# 初始化 A 和 B A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} # 使用 & 运算符 # 输出 : {4, 5} print(A & B)
在Python shell上尝试以下示例。
# 在A上使用交集函数 >>> A.intersection(B) {4, 5} # 在B上使用交集函数 >>> B.intersection(A) {4, 5}
A和B的差(A-B)是仅在A中但不在B中的一组元素。类似地,B-A是B中但不在A中的一组元素。
差异是使用 -运算符执行的。使用difference()方法可以完成相同的操作。
# 初始化 A 和 B A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} # 在A上使用 - 运算符 # Output: {1, 2, 3} print(A - B)
在Python shell上尝试以下示例。
# 在A上使用差异函数 >>> A.difference(B) {1, 2, 3} # 在B上使用-运算符符 >>> B - A {8, 6, 7} # 在B上使用差异函数 >>> B.difference(A) {8, 6, 7}
A和B的对称差异是A和B中的一组元素,但两者中的元素相同。
对称差使用^运算符执行。使用symmetric_difference()方法可以完成相同的操作。
# 初始化 A 和 B 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函数 >>> A.symmetric_difference(B) {1, 2, 3, 6, 7, 8} # 在B上使用symmetric_difference函数 >>> B.symmetric_difference(A) {1, 2, 3, 6, 7, 8}
集合方法很多,上面已经使用了其中的一些方法。这是set对象可用的所有方法的列表。
方法 | 描述 |
---|---|
add() | 将元素添加到集合中 |
clear() | 从集合中删除所有元素 |
copy() | 返回集合的副本 |
difference() | 返回两个或多个集合的差作为新集合 |
difference_update() | 从该集合中删除另一个集合的所有元素 |
discard() | 如果元素是成员,则从集合中删除它。(如果元素不在集合中,则不执行任何操作) |
intersection() | 返回两个集合的交集作为新集合 |
intersection_update() | 用自身和另一个的交集更新集合 |
isdisjoint() | True如果两个集合的交点为空,则返回 |
issubset() | 返回 True另一个集合是否包含此集合 |
issuperset() | 返回 True此集合是否包含另一个集合 |
pop() | 删除并返回一个任意的set元素。提高KeyError,如果集合为空 |
remove() | 从集合中删除一个元素。如果元素不是成员,则引发一个KeyError |
symmetric_difference() | 将两个集合的对称差作为新集合返回 |
symmetric_difference_update() | 用本身和另一个的对称差异更新一个集合 |
union() | 返回新集合中集合的并集 |
update() | 用自身和其他元素的并集更新集合 |
我们可以使用in关键字来测试项目是否存在于集合中。
# 初始化 my_set my_set = set("apple") # 检查“a”是否存在 # 输出: True print('a' in my_set) # 检查“p”是否存在 # 输出: 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()等常用来与set一起执行不同的任务。
功能 | 描述 |
---|---|
all() | 如果集合的所有元素都为true(或者集合为空),则返回True。 |
any() | 如果集合中的任何元素为true,则返回True。 如果集合为空,则返回False。 |
enumerate() | 返回一个枚举对象。它包含成对的所有项的索引和值。 |
len() | 返回集合中的长度(项目数)。 |
max() | 返回集合中最大的项目。 |
min() | 返回集合中最小的项目。 |
sorted() | 从集合中的元素返回一个新的排序列表(不对集合本身进行排序)。 |
sum() | 返回集合中所有元素的总和。 |
Frozenset是具有集合特征的新类,但是一旦分配,就不能更改其元素。元组是不可变列表,而冻结集是不可变集。
可变的集合不可散列,因此不能用作字典键。另一方面,frozenset是可哈希化的,可用作字典的键。
可以使用函数Frozenset()创建Frozensets。
此数据类型支持的方法,如copy(),difference(),intersection(),isdisjoint(),issubset(),issuperset(),symmetric_difference()和union()。由于不可变,因此没有添加或删除元素的方法。
# 初始化 A 和 B 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'