Python的set集合详解

Python 还包含了一个数据类型 —— set (集合)。集合是一个无序不重复元素的集。基本功能包括关系测试和消除重复元素。集合对象还支持 union(联合),intersection(交),difference(差)和 sysmmetric difference(对称差集)等数学运算。

创建集合set

大括号或 set() 函数可以用来创建集合。

  set集合类需要的参数必须是迭代器类型的,如:序列、字典等,然后转换成无序不重复的元素集。由于集合是不重复的,所以可以对字符串、列表、元组进行去重操作。

创建空集合

>>> s=set()>>> sset()>>> s1=set([]) #列表>>> s1set()>>> s2=set(()) #元组>>> s2set()>>> s3=set({}) #字典>>> s3set()

注意:想要创建空集合,你必须使用 set() 而不是 {}。后者用于创建空字典,我们在后面介绍的一种数据结构。

创建非空集合

 即列表,元组,字典不在是空值,举两个例子

>>> s1=set([1,2,3,4])>>> s1{1,2,3,4}>>> s3=set({'a':2,'b':3,'c':4})>>> s3{'c','a','b'}

  注:字典转set集合,需要注意的是,只取了字典的key,相当于将字典中的dict.keys()列表转成set集合。

集合的操作

集合添加

  集合的添加有两种方式,分别是add和update。但是它们在添加元素时是由区别的:

add()方法 

把要传入的元素作为一个整体添加到集合中,如:

>>> s=set('one')>>> s{'e','o','n'}>>> s.add('two')>>> s{'e','two','o','n'}

update()方法 

是把要传入的元素拆分成单个字符,存于集合中,并去掉重复的字符。可以一次添加多个值,如:

>>> s=set('one')>>> s{'e','o','n'}>>> s.update('two')>>> s{'e','n','t','w','o'}

集合删除

  集合的删除操作使用的方法跟列表是一样的,使用的也是remove方法。如:

setVar.remove(element) 

setVar :为一个set类型的变量 

element :表示要查找并删除的元素 

函数作用: 

在集合setVar中查找element元素,如果存在则删除;如果没找到,则报错。

>>> s=set('one')>>> s{'e','o','n'}>>> s.remove('e')>>> s{'n','o'}

更多精彩文章关注微信公众号【python社区营】

python开发IT技术交流群:887934385

setVar.discard(element) 

setVar :为一个set类型的变量 

element :表示要查找并删除的元素 

函数作用: 

在集合setVar中查找element元素,如果存在则删除;如果没找到,则什么也不做。

>>> sListset([1,2,3,4,5])>>>sList.discard(1)>>>sListset([2,3,4,5])

s.pop() 

s:为set类型的变量 

函数作用: 

删除并返回set类型的s中的一个不确定的元素,如果为空引发KeyError错误。

>>> sListset([2,3,4,5])>>>sList.pop()2

s.clear() 

s:set类型的变量 

函数作用: 

清空s集合中的所有元素

>>> sListset([3,4,5])>>>sList.clear()>>>sListset([])

集合的遍历

集合的遍历跟序列的遍历方法完全一样。

>>> s=set('one')>>> s{'e','o','n'}>>> foriins:    print(i)... ...eon>>>

另一种遍历方式:

>>> s=set('one')>>> s{'e','o','n'}>>> foridex,iinenumerate(s):print(idex,i)... ...0e1o2n>>>

变量idex表示集合中元素i的索引。

集合其他方法

函数说明

len(s)set 的长度

x in s测试 x 是否是 s 的成员

x not in s测试 x 是否不是 s 的成员

s.issubset(t)测试是否 s 中的每一个元素都在 t 中

s.issuperset(t)测试是否 t 中的每一个元素都在 s 中

s.union(t)返回一个新的 set 包含 s 和 t 中的每一个元素

s.intersection(t)返回一个新的 set 包含 s 和 t 中的公共元素

s.difference(t)返回一个新的 set 包含 s 中有但是 t 中没有的元素

s.symmetric_difference(t)返回一个新的 set 包含 s 和 t 中不重复的元素

s.copy()返回 set “s”的一个浅复制

集合的一些操作符

  既然是集合,那就会遵循集合的一些操作方法,如求交集、并集、差集等。

交集 ###

  Python中求集合的交集使用的符号是“&”,返回连个集合的共同元素的集合,即集合的交集。

>>> st1 =set('python')>>> st1set(['h','o','n','p','t','y'])>>> st2 =set('htc')>>> st2set(['h','c','t'])>>> st1 & st2set(['h','t'])

并集(合集) ###

  Python中求集合的并集用的是符号“|”,返回的是两个集合所有的并去掉重复的元素的集合。

>>> st1set(['h','o','n','p','t','y'])>>> st3 =set('two')>>> st3set(['o','t','w'])>>> st1 | st3set(['p','t','w','y','h','o','n'])

差集

  Python中差集使用的符号是减号“-”。

>>> st1set(['1','3','2','5','4','7','6'])>>> st2 =set('4589')>>> st2set(['9','8','5','4'])>>> st1 - st2set(['1','3','2','7','6'])

  返回的结果是在集合st1中但不在集合st2中的元素的集合。

集合的不同

查看两个集合的不同之处,使用的difference函数,等价于差集。如: 

s1.difference(s3) 

这种不同指的是集合s3相对于集合s1,不同的地方,也就是所有在集合s1中,而不再集合s2中的的元素组成的新集合。

>>> s1set([1,2,3,4,5])>>> s2set([1,2,3,4])>>> s1.difference(s2)set([5])>>> s3set(['1','8','9','5'])>>> s1.difference(s3)set([1,2,3,4,5])

集合的范围判断

  集合可以使用大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)、不等于(!=)来判断某个集合是否完全包含于另一个集合,也可以使用子父集判断函数。

 定义三个集合s1,s2,s3:

>>> s1=set([1,2,3,4,5])>>> s2=set([1,2,3,4])>>> s3=set(['1','8','9','5'])

大于(>)或大于等于(>=)

>>> s1 > s2True>>> s1 > s3False>>> s1 >= s2True

  表示左边集合是否完全包含右边集合,如集合s1是否完全包含集合s2。

小于(<)或 小于等于(<=)

>>> s2 < s1True>>> s1 < s3False>>> s3 < s1False

  表示左边的集合是否完全包含于右边的集合,如集合s1是否完全包含于集合s2。

等于(==)、不等于(!=)

>>> s1 == s2False>>> s2 == s3False>>> s1 != s2True

  判断两个集合是否完全相同。

不可变集合frozenset

  Python中还有一种不可改变的集合,那就是frozenset,不像set集合,可以增加删除集合中的元素,该集合中的内容是不可改变的,类似于字符串、元组。

>>> f = frozenset()>>> ffrozenset([])>>> f = frozenset('asdf')>>> ffrozenset(['a','s','d','f'])>>> f = frozenset([1,2,3,4])>>> ffrozenset([1,2,3,4])>>> f = frozenset((1,2,3,4))>>> ffrozenset([1,2,3,4])>>> f = frozenset({1:2,'a':2,'c':3})>>> ffrozenset(['a',1,'c'])

如果试图改变不可变集合中的元素,就会报AttributeError错误。 

不可变集合,除了内容不能更改外,其他功能及操作跟可变集合set一样。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容