首页 菜鸟问答正文

Python|集合set的概念、构造、操作(操作符、对象方法、函数)

piaodoo 菜鸟问答 2022-08-04 05:41:18 867 0

集合set是Python定义的一种很重要的组合对象,在一个集合对象里可以汇集一批作为元素的对象,元素之间没有特殊关系。

集合set使用一对大括号作为定界符,元素之间使用逗号分隔,同一个集合内的每个元素都是唯一的,元素之间不允许重复。

Python有两个表示集合的类型:set和frozenset(冻结集合),两者的不同在于set是可变类型,而frozenset是不变类型。

1 概念

集合的概念来自于数学。数学里的集合就是一批元素的汇集,其最重要的性质是可以回答某个元素e是否属于集合s,也就是说,判断e是否为s的元素。在与集合相关的讨论中,元素作为一个不加定义的概念,除了元素判断之外,集合还有一组重要运算,包括集合之间的子集判断、两个集合的并集、交集、差集运算等。这些运算都可以基于集合的元素关系定义。

程序里也经常需要具有集合性质的对象,Python为此提供了集合类型。我们可以把一批任意元素汇集在一起,构成一个set或frozenset类型的对象。这里主要讨论set,实际上,与元素变动无关的内容均适用于frozenset。

Python对集合的元素也有要求,它们只能是不变对象(可哈希),而且必须能做相等比较(用==运算符)。内置的数字、字符串、bool对象、元组都满足这些要求(不包含列表、字典、集合等可变类型的数据)。disk

Python提供了一个内置函数hash()来计算对象的哈希值,凡是无法计算出哈希值(调用内置函数hash()时抛出异常)的对象都不能作为集合的元素(当然也不能作为字典对象的键)。

由于基本概念源于数学,Python的集合同样支持元素判断,也支持各种重要的集合操作,包括并集、交集、差集等。除此之外,set类型还支持一批变动操作,包括加入或删除元素的操作,以及用一些扩展赋值运算符描述的变动操作。

与数学的集合类似,Python集合里的元素具有唯一性,不会出现重复元素,元素之间也没有顺序关系。

set是只有key的支持集合运算的dict:set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。同样的,相当于list而言,set和dict类似,其查找速度特别快,另外还可以支持集合的并集、交集、差集运算。

2 集合构造

Python用形如 {表达式, ……} 的表达式描述集合。这些表达式求值的结果得到集合的元素。在建立集合时,解释器自动消除重复元素。disk

值得注意的是,集合的这种描述形式和字典类似,两者的差别在于构成元素的不同。集合的每个元素是一般的表达式,而字典的每个元素描述是冒号分隔的一对表达式。

2.1 直接使用定义构造set集合

2.2 使用set()转换,转换的对象可以是任意的序列或可迭代对象。

由于用花括号形式总是生成set(或字典),要生成不变集合frozenset的对象,只能用frozenset(……)的形式,如:

2.3 用描述式生成集合

3 set和其它类型的转换

tuple → set:要求tuple元素能用==比较,重复元素只保留一个,顺序丢失;

set → tuple:没有限制;

list → set:要求list元素满足set对元素的要求,重复元素只保留一个,顺序丢失;

set → list:没有限制;

str → set :集合元素是单个字符,重复字符只保留一个,顺序丢失;

dict → set:集合元素为字典里的关键字;

4 集合的比较

主要是比较集合之间的包含关系(一个集合的元素是否属于另一个集合),也就是子集与超集的关系。

如果一个集合的元素都属于另一个集合,则称前一集合是后一集合的子集,或称后一集合是前一集合的超集。显然,一个集合总是其自身的子集,也是其自身的超集。如果一个集合是另一集合的子集,而且两个集合不等,那么前一集合就是一个真子集,类似地,后一集合就是真超集。disk

也就是说,子集与超集的关系是包含或相等关系;而真子集与真超集则 是包含且不相等关系。

s1 <= s2当且仅当s1为s2的子集时返回True
s1.issubset(s2)同上
s1 < s2当且仅当s1为s2的真子集时返回True
s1 >= s2当且仅当s2为s1的超集时返回True
s1.issupset(s2)同上
s1 > s2当且仅当s2为s1的真超集时返回True
s1.isdisjoint(s2)判断两个集合是否不相交,即是否有公共元素

5 集合运算

Python集合提供了一组与数学的集合运算对应的运算。

s1.union(s2,…)并运算生成一个新集合
s1 | s2 | …同上
s1.intersection(s2,…)交运算生成一个新集合
s1 & s2 & …同上
s1.difference(s2,…)差运算生成一个新集合
s1 - s2 - …同上
s1.symmetric_difference(s2)(s1 - s2) | (s2 - s1)
s1.copy()生成s1的一个拷贝

6 修改和更新集合

s1.update(s2,…)修改s1,使之包含属于其他集合的元素
s1 |= s2 | …同上
s1.intersection_update(s2,…)修改s1,使之包含同属所有集合的公共元素
s1 &= s2 & …同上
s1.difference_update(s2,…)修改s1,从中去除属于其他集合的元素
s1 -= s2 - …同上
s1.symmetric_difference_update(s2)修改s1,使之包含仅属于s1或s2之一但不同时属于两者的元素
s.add(x)将元素x加入集合s
s.remove()从s里删除元素x,在s没有x时报错
s.discard(x)如果s里有x就抛弃它,没有x时什么也不做
s.pop()从s里删除某个(任意)元素并返回它,具体元素由集合内部确定。如果操作时s为空则报错
s.clear()清除s里的所有元素

附原码:

x = 2

s1 = {x,x+5,x**10} 直接使用定义构造set集合

s2 = {Chinese,Math,English,Physics,Chemisty,biology,Math}

print(s1,\n,s2)

{1024, 2, 7}

{Chemisty, Math, Physics, Chinese, biology, English}

set基于"=="判断元素是否重复,如果重复,后面的舍弃掉

print({1,1.0})

print({1.0,1})

print({1,True})

print({False,0})

print({1,1.0,True,0,False})

{1}

{1.0}

{1}

{False}

{0, 1}

lis = [1,1,2,3,5,8,13]disk

tup = (1,7,13,19,23,29)

print(set(lis)) 使用set()转换list构造set

print(set(tup)) 使用set()转换tuple构造set

print(frozenset(lis)) 使用frozenset转换list构造frozenset

{1, 2, 3, 5, 8, 13}

{1, 7, 13, 19, 23, 29}

frozenset({1, 2, 3, 5, 8, 13})

用描述式生成集合

s3 = {x*y for x in range(10) for y in range(10) if x*3 < y**2}

相当于以下代码:

s3 = set()

for x in range(10):

for y in range(10):

if x*3 < y**2:

s3.add(x*y)

fs = frozenset(n ** 2 for n in range(-10, 20))

print(s3,\n,fs)

{0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25,disk

27, 28, 30, 32, 35, 36, 40, 42, 45, 48, 49, 54, 56, 63, 64, 72, 81}

frozenset({64, 1, 0, 121, 100, 36, 4, 196, 225, 9, 169, 256, 324,

361, 289, 16, 81, 49, 144, 25}

a = set(abracadabra) unique letters in a

b = set(alacazam) unique letters in b

print(a)

print(b)

print(a - b) difference(差):letters in a but not in b

print(a | b) union(联合): letters in either a or b

print(a & b) intersection(交):letters in both a and b

print(a ^ b) letters in a or b but not both

sysmmetric difference(对称差集)letters in a or b but not bothdisk

{b, c, a, r, d}

{m, c, a, z, l}

{b, r, d}

{b, m, c, a, z, l, r, d}

{a, c}

{b, m, l, r, d, z}

-End-

版权声明:

本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。

有关影视版权:本站只供百度云网盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件告知【754403226@qq.com】,在收到邮件后72小时内删除。本文链接:https://www.piaodoo.com/119037.html

社交距离(socialdistance)

  • 表距离还在用distance吗?其实你还有其他选择

    表距离还在用distance吗?其实你还有其他选择

  • △5日,海南三亚,核酸检测有序开展。

  • 全国疫情今天(8月6日)最新消息通报:昨日本土新增310+275,其中海南262+46

  • 北京疫情地图分布图实时更新(查询入口)

    北京疫情地图分布图实时更新(查询入口)

  • 搜索

    文章专栏

    最近发表

    标签列表