Python之集合

集合 set

  • 集合是可变的容器
  • 集合内的数据对象是唯一的(不能重复多次的)
  • 集合是无序的存储结构,集合中的数据没有先后关系
  • 集合内的元素必须是不可变对象
  • 集合是可迭代对象
  • 集合是相当于只有键没有值的字典(键则是集合的数据)

集合的创建

# 创建非空集合
s1 = set()

# 创建非空集合
s2 = {1, 2, 3}
s3 = {1, 2, 3, 'a', 'B'}

集合的构造函数

set(iterable) 用可迭代对象创建一个新的集合对象

s1 = set("ABC")           # s1 = {'A', 'C', 'B'}
s2 = set('ABCCBA')        # s2 = {'A', 'B', 'C'}

dic = {1:"一", 2:'二', 5:'五'}
# 字典生成集合,默认情况下会以键作为集合的元素
s3 = set(dic)             # s3 = {1, 2, 5}
# 以字典的值作为元素生成集合
s4 = set(dic.values())    # s4 = {'一', '五', '二'}
# 以字典的键值对作为元素生成集合
s5 = set(dic.items())     # s5 = {(2, '二'), (1, '一'), (5, '五')}

# 列表作为生成集合
s6 = set([1, 3.14, False])   # s6 = {False, 1, 3.14}

# 元组生成集合
s7 = set((2, 3, 5, 7))   #  s7 = {2, 3, 5, 7}

s8 = set([1, 2, [3.1, 3.2], 4])   # 报错,[3.1, 3.2]是可变对象

集合的运算

集合之间也可进行数学集合运算,可用相应的操作符或方法来实现

交集

  • 两个集合 A 和 B 的交集是既属于 A 又属于 B 的元素
  • 使用 & 操作符执行交集操作,也可使用方法 intersection() 方法
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s3 = {3, 4, 5}
s4 = {7, 8, 9}

s5 = s1 & s2                              # s5 = {2, 3}
s6 = s1 & s2 & s3                         # s6 = {3}
s7 = s1 & s4                              # s7 = set()

s8 = s1.intersection(s2)                  # s8 = {2, 3}
s9 = s1.intersection(s2).intersection(s3) # s9 = {3}

并集

  • 并集是这些集合的所有元素构成的集合
  • 使用操作符 | 执行并集操作,也可使用方法 union() 方法
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s3 = {3, 4, 5}
s4 = {7, 8, 9}

s5 = s1 | s2                      # s5 = 1, 2, 3, 4}
s6 = s1 | s2 | s3                 # s6 = {1, 2, 3, 4, 5}

s7 = s1.union(s2)                 # s7 = {1, 2, 3, 4}
s8 = s1.union(s2).union(s3)       # s8 = {1, 2, 3, 4, 5}  

补集

  • 补集亦称差集,A 与 B 的差集是所有属于 A 且不属于 B 的元素构成的集合
  • 使用操作符 - 执行差集操作,也可使用方法 difference() 方法
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s3 = {3, 4, 5}
s4 = {7, 8, 9}

s5 = s1 - s2                           # s5 = {1}
s51 = s2 - s1                          # s51 = {4}
s6 = s1 - s2 - s3                      # s6 = {1}

s6 = s1.difference(s2)                 # s6 = {1}
s7 = s1.difference(s2).difference(s3)  # s7 = {1}

对称补集

  • 只属于其中一个集合,而不属于另一个集合的元素组成的集合
  • 使用 ^ 操作符执行差集操作也,可使用方法 symmetric_difference() 方法
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s3 = {3, 4, 5}
s4 = {7, 8, 9}

s5 = s1 ^ s2                           # s5 = {1,4}
s51 = s2 ^ s1                          # s51 = {1,4}
s6 = s1 ^ s2 ^ s3                      # s6 = {1, 3, 5}

s6 = s1.symmetric_difference(s2)       # s6 = {1,4}
s7 = s1.symmetric_difference(s2).symmetric_difference(s3)  # s7 = {1, 3, 5}

子集

  • 子集,为某个集合中一部分的集合,故亦称部分集合
  • 使用操作符 < 执行子集操作,也可使用方法 issubset() 方法
s1 = {1, 2, 3}
s2 = {2, 3}
s3 = {7, 8, 9}

s4 = s2 < s1         # True
s5 = s3 < s1         # False

s6 = s2.issubset(s1) # True
s7 = s3.issubset(s1) # False

超集

  • 集合A与B,若A包含B,则称A为B的超集
  • 使用操作符 > 执行超集操作,也可使用方法 issuperset() 方法
s1 = {1, 2, 3}
s2 = {2, 3}
s3 = {7, 8, 9}

s4 = s1 > s2        # True
s5 = s1 > s3        # False

s6 = s1.issuperset(s2) # True
s7 = s1.issuperset(s3) # False

相同与不相同

集合的相同是指集合的个数和元素均相同,与次序无关

s1 = {1, 2, 3}
s2 = {2, 3, 1}

s1 == s2  # True
s1 != s2  # False 

in / not in 运算符

  • in 运算符用于集合中,当某个值存在于集合中,则为真,否则为假
  • not inin 返回值相反
 s = {1, 'Two', 3.14}
 1 in s         # True
 2 in s         # False
 3.14 not in s  # False
 4 not in s     # True

练习

s1 = {'曹操','刘备','周瑜'}
s2 = {'曹操','周瑜','张飞','赵云'}
print(s1 & s2)           # {'曹操', '周瑜'}
print(s1 - s2)           # {'刘备'}
print(s2 - s1)           # {'赵云', '张飞'}
print('张飞' in s1)      # False
print(s1 ^ s2)           # {'赵云', '刘备', '张飞'}
print(s1 | s2)           # {'周瑜', '赵云', '张飞', '刘备', '曹操'}

Python3中可用于集合的内置函数

len(x),max(x),min(x),sum(x),any(x),all(x)

集合的方法

  • s.add(e) 向集合 s 中添加元素 e
  • s.remove(e) 从集合 s 中删除一个元素,如果元素不存在于集合中,则会产生一个 KeyError 错误
  • s.discard(e) 从集合 s 中移除一个元素 e,在元素 e 不存在时什么都不做
  • s.clear() 清空集合 s 内的所有元素
  • s.copy() 将集合 s 进行一次浅拷贝
  • s.pop() 从集合 s 中删除一个随机元素;如果此集合为空,则引发 KeyError异常
  • s.update(s1)ss1 得到的全集更新变量 s
  • s.difference(s2)s - s2 运算,返回存在于在s中,但不在s2中的所有元素的集合
  • s.difference_update(s2) 等同于 s = s - s2
  • s.intersection(s2) 等同于 s & s2
  • s.intersection_update(s2) 等同于s = s & s2
  • s.isdisjoint(s2) 如果 ss2 交集为空返回True,非空则返回False
  • s.issubset(s2) 如果 ss2 交集为非空返回True,空则返回False
  • s.issuperset(...) 如果 ss2 的子集返回 True,否则返回 False
  • s.symmetric_difference(s2) 返回对称补集,等同于 s ^ s2
  • s.symmetric_difference_update(s2)ss2 的对称补集更新 s
  • s.union(s2) 生成 ss2 的全集

集合推导式

用可迭代对象来创建(生成)集合的表达式

语法

 { 表达式 for 变量 in 可迭代对象 [if 真值表达式] }

示例

L = [2, 3, 5, 7, 3, 5, 7, 11]
s = { x**2 for x in L}                  # s={4,9,25,49,121}

L = [2, 3, 5, 7, 3, 5, 7, 11]
s = { x**2 for x in L if x > 4}         # s={25, 121, 49}

固定集合

固定集合是不可变的,无序的,含有唯一元素的集合

作用

固定集合可以作为字典的键,也可以作为集合的值(元素)

创建固定集合

# 创建空的固定集合
fs = frozenset()             # fs = frozenset()

# 创建非空的固定集合
fs = frozenset([2,3,5,7])    # fs = frozenset({2, 3, 5, 7})

固定集合的运算

与集合的运算一致

固定集合的方法

相当于集合的全部方法去掉修改集合的方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容