山地人

Python 集合(Set)

山地人
山地人
2021-07-16

集合

在初中的数学课上,我们就学过集合了。比如给定两个集合,求这两个集合的并集、交集和差集。Python为我们提供了集合(Set),使用这个Set就可以计算上面这些并集、交集和差集的问题。

Python的集合(Set)有一下一些特点:

  • Python的集合是一个无序集合,不像列表(List)中的元素是一个有序的序列。
  • Python集合中的元素必须都是唯一的,不允许在同一集合中出现两个相同的元素。
  • Python集合本身是可变的,但是内部的每一个元素必须是不可变类型的。因此集合中的内部元素只能是:字符串,数字,元组这种不可变类型。

创建集合

了解了集合的概念后,我们来看看如何创建Python集合。在Python中有两种创建集合的方式:

  1. 通过{}来创建集合:如{1,2,3}
  2. 通过set(iterable)函数来创建集合,这里的参数iterable表示只要是可迭代对象,都可以用来创建集合。
  • set()不传任何参数可以创建空集合。
  • set([1,2,3])创建一个包含1,2,3的集合。
mySet = set()
mySet2 = {1,2,3}
# 使用type来测试是否为set类型
type(mySet)

启动终端,尝试创建一些集合,并用type()函数检查这些对象的类型。

创建空集合

这里需要注意,对于创建空集合的方式,在Python中只能通过set()来创建。因为{}大括号内部不放任何东西的情况下,创建的是字典dict。这一点特别要注意。

访问集合元素

由于集合中的元素是无序的,因此不能通过索引的方式访问集合中的元素。

遍历集合元素

虽然不能通过索引方式来访问指定位置的集合元素,但是集合本身是可迭代对象,因此可以使用for in语句来遍历集合中的元素。

集合与集合的运算

学会了如何创建集合,接下来,我们就来看下如何对这些集合进行运算。

并集运算

并集:如果有A和B两个集合,A和B的并集就是A中的所有元素和B中所有元素的,不包括其他元素的集合。说更直白一点,比如A中有1,2,3,B有3,4,5,那A和B的并集AUB就是1,2,3,4,5,除此之外不包含其他元素了。

搞清楚了并集的概念,接下来看看Python提供的计算并集的两种方式:

  • x.union(x2[,x3...]) 通过集合自己的union成员方法来计算和其他集合的并集
  • x | x2 [| x3 ...] 通过|运算符来计算集合之间的并集。

下面是一些具体差集计算的例子:

a = {1, 2, 3}
b = {3, 4, 5}
c = {10, 20}
# 用函数计算并集
a.union(b)
a.union(b, c)
# 使用"|"计算并集
a | b
a | b | c

点击运行,观察运行结果。

交集运算

交集:将各个集合中都出现的元素都找出来,组合成一个集合,这个形成的集合就是原来那几个集合的交集。比如:A集合中有1,2,3,B集合中有3,4,5。A和B的交集是3

Python中计算交集的两种方式:

  • x.intersection(x2[,x3...]) 通过集合自己的intersection成员方法来计算和其他集合的交集
  • x & x2 [& x3 ...] 通过|运算符来计算集合之间的交集。

下面是一些具体交集计算的例子:

a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
c = {4, 5, 6, 7}
# 用函数计算交集
a.intersection(b)
a.intersection(b, c)
# 使用"&"计算交集
a & b
a & b & c

点击运行,观察运行结果。

差集运算

差集: A和B的差集,就是从A中剔除掉在B中也出现的元素,剔除后剩下的元素构成的集合。 比如:A中有1,2,3,B中有3,4,5,那么A和B的差集是1,2。反过来B和A的差集是4,5

Python中计算差集的两种方式:

  • x.difference(x2[,x3...]) 通过集合自己的difference成员方法来计算和其他集合的差集
  • x - x2 [- x3 ...] 通过|运算符来计算集合之间的差集。

下面是一些具体差集计算的例子:

a = {1, 2, 3,}
b = {3, 4, 5}
c = {1}
# 用函数计算差集
a.difference(b)
a.difference(b, c)
# 使用"-"计算差集
a - b
a - b - c

点击运行,观察运行结果。

对称差集运算

对称差:和差集不同,A和B的差集最后得到的集合都是A中的元素,A和B的对称差则是把A和B共有的元素去掉,A和B中剩下的元素组成的集合叫做对称差集

Python中计算对称差集的两种方式:

  • x.symmetric_difference(x2) 通过集合自己的symmetric_difference成员方法来计算和其他集合的对称差集,这里需要注意函数版的对称差计算只支撑两个集合计算对称差,不支持多个集合同时计算对称差集。
  • x ^ x2 [^ x3 ...] 通过|运算符来计算集合之间的对称差集。

下面是一些具体差集计算的例子:

a = {1, 2, 3,}
b = {3, 4, 5}
c = {3, 2, 4, 6}
# 用函数计算对称差集
a.symmetric_difference(b)
a.symmetric_difference(b).symmetric_difference(c)
# 使用"^"计算对称差集
a ^ b
a ^ b ^ c

这里需要注意的是不管是连续使用symmetric_difference调用还是^,比如a^b^c并不是a,b,c三个集合的对称差集,而只是a和b形成的对称差集合c集合的对称差集。

点击运行,观察运行结果。

讲完各种集合计算问题,我们来看看,如何修改集合元素。

添加新元素

既然集合本省是可变的,那么自然可以往集合中添加新元素。使用集合的add(elem)方法往集合中添加一个元素。

a = {1, 2, 3}
a.add(4)

启动终端,往a集合中添加一些元素。

删除元素

有添加自然也少不了删除,使用集合的remove(elem)删除集合中匹配的elem元素。

a = {1, 2, 3}
a.remove(2)

启动终端,删除集合a中的元素。

更新元素

集合虽然是可变类型,但是集合不是有序的,不能通过索引的方式获取到集合内元素,因此也就是不能使用索引方式来修改集合元素。但Python还是给我们提供了一个修改集合元素的方法:update(iterable)。可以通过往update中传入一个可迭代对象。

a = {1, 2, 3}
a.update({2,4,6})

修改后的最终结果效果类型一个并集操作,将a和可迭代对象中的全部元素都放入了a集合。

启动终端,测试update的效果。

集合的成员方法

上面已经涉及到不少集合的成员方法,这里罗列下常用的集合成员方法。

方法名说明例子
add(elem)如果集合中不存在elem则往集合中添加一个elem元素。mySet.add(5)
clear()清空集合中的所有元素mySet.clear()
copy()返回一个浅层克隆的新集合mySet.copy()
difference(set)返回当前集合与参数集合的差集mySet.difference(b)
difference_update(set)用当前集合和参数集合的差集更新当前集合
discard(elem)如果集合中存在elem元素,将其删除mySet.discard(5)
intersection(set)求当前集合与参数中集合的交集mySet.intersection(otherSet)
intersection_update()计算出于参数集合的交集后,用此交集更新原集合mySet.intersection_update(otherSet)
isdisjoint(set)查看两个集合是否有交集,有则返回True,否则返回FalsemySet.isdisjoint(otherSet)
issubset(set)当前集合是否是参数中集合的子集,是则返回True,否则返回FalsemySet.issubset(otherSet)
issuperset(set)当前集合是否是参数中集合的超集,是则返回True,否则返回FalsemySet.issuperset(otherSet)
pop()随机移除集合中的一个元素,并返回此元素mySet.pop()
remove(elem)如果集合中有elem将其移除,否则会产生错误mySet.remove(5)
symmetric_difference(set)计算两个集合中不相同的元素的合集mySet.symmetric_difference(otherSet)
symmetric_difference_update()计算两个集合中不相同的元素的合集并用此集合更新原集合mySet.symmetric_difference_update(otherSet)
union(set1[,set2…])返回这几个集合的并集mySet.union(set2, set3)
update(set)给集合添加元素mySet.update(otherSet)

运行下面的沙盒,观察结果。你也可以测试你感兴趣的成员函数。

至此,本篇教程也到了该和你说再见的时候了,我们下期再见。

学完本篇互动教程,如果你觉得体验不错,可以把网页链接发送给你的小伙伴,让他/她也来感受一下。当然,你也可以继续看看网站上其他的的互动教程,希望`idev365`能够给你带来收获。

学习教程的过程中碰到了问题,或者对idev365有什么改进意见和想法,欢迎加入idev365微信内测群,和山地人交流你的想法。