python 中的集合(set) 详解
在Python set是基本数据类型的一种集合类型,它有可变集合(set())和不可变集合(frozenset)两种。
创建集合set、集合set添加、集合删除、交集、并集、差集的操作都是非常实用的方法。
set 是一个无序的元素集合,支持并、交、差及对称差等数学运算, 但由于 set 不记录元素位置,因此不支持索引、分片等类序列的操作。
tuple算是list和str的杂合(杂交的都有自己的优势,上一节的末后已经显示了),那么set则可以堪称是list和dict的杂合.
set拥有类似dict的特点:可以用{}花括号来定义;其中的元素没有序列,也就是是非序列类型的数据;而且,set中的元素不可重复,这就类似dict的键.
set也有一点list的特点:有一种集合可以原处修改.
一:创建集合set:
python set类是在python的sets模块中,大家现在使用的python2.3中,不需要导入sets模块可以直接创建集合。
1 2 | >>> set ( 'boy' ) set ([ 'y' , 'b' , 'o' ]) |
二:集合添加、删除
集合的添加有两种常用方法,分别是add和update。集合add方法:是把要传入的元素做为一个整个添加到集合中,例如:
1 2 3 4 | >>> a = set ( 'boy' ) >>> a.add( 'python' ) >>> a set ([ 'y' , 'python' , 'b' , 'o' ]) |
集合update方法:是把要传入的元素拆分,做为个体传入到集合中,例如:
1 2 3 4 | >>> a = set ( 'boy' ) >>> a.update( 'python' ) >>> a set ([ 'b' , 'h' , 'o' , 'n' , 'p' , 't' , 'y' ]) |
集合删除操作方法:remove
1 2 3 4 | set ([ 'y' , 'python' , 'b' , 'o' ]) >>> a.remove( 'python' ) >>> a set ([ 'y' , 'b' , 'o' ]) |
set的常用方法
add, update
>>> help(set.add)
Help on method_descriptor:
add(...)
Add an element to a set.
This has no effect if the element is already present.
下面在交互模式这个最好的实验室里面做实验:
>>> a_set = {} #我想当然地认为这样也可以建立一个set
>>> a_set.add("qiwsir") #报错.看看错误信息,居然告诉我dict没有add.我分明建立的是set呀.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'add'
>>> type(a_set) #type之后发现,计算机认为我建立的是一个dict
<type 'dict'>
特别说明一下,{}这个东西,在dict和set中都用.但是,如上面的方法建立的是dict,不是set.这是python规定的.要建立set,只能用前面介绍的方法了.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | >>> a_set = { 'a' , 'i' } #这回就是set了吧 >>> type (a_set) < type 'set' > #果然 >>> a_set.add( "qiwsir" ) #增加一个元素 >>> a_set #原处修改,即原来的a_set引用对象已经改变 set ([ 'i' , 'a' , 'qiwsir' ]) >>> b_set = set ( "python" ) >>> type (b_set) < type 'set' > >>> b_set set ([ 'h' , 'o' , 'n' , 'p' , 't' , 'y' ]) >>> b_set.add( "qiwsir" ) >>> b_set set ([ 'h' , 'o' , 'n' , 'p' , 't' , 'qiwsir' , 'y' ]) >>> b_set.add([ 1 , 2 , 3 ]) #报错.list是不可哈希的,集合中的元素应该是hashable类型。 Traceback (most recent call last): File "<stdin>" , line 1 , in <module> TypeError: unhashable type : 'list' >>> b_set.add( '[1,2,3]' ) #可以这样! >>> b_set set ([ '[1,2,3]' , 'h' , 'o' , 'n' , 'p' , 't' , 'qiwsir' , 'y' ]) |
除了上面的增加元素方法之外,还能够从另外一个set中合并过来元素,方法是set.update(s2)
1 2 3 4 5 6 7 8 9 10 11 12 13 | >>> help ( set .update) update(...) Update a set with the union of itself and others. >>> s1 set ([ 'a' , 'b' ]) >>> s2 set ([ 'github' , 'qiwsir' ]) >>> s1.update(s2) #把s2的元素并入到s1中. >>> s1 #s1的引用对象修改 set ([ 'a' , 'qiwsir' , 'b' , 'github' ]) >>> s2 #s2的未变 set ([ 'github' , 'qiwsir' ]) |
如果仅仅是这样的操作,容易误以为update方法的参数只能是集合。非也。看文档中的描述,这个方法的作用是用原有的集合自身和其它的什么东西构成的新集合更新原来的集合。这句话有点长,可以多读一遍。分解开来,可以理解为:others是指的作为参数的不可变对象,将它和原来的集合组成新的集合,用这个新集合替代原来的集合。举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | >>> s2.update( "goo" ) >>> s2 set ([ 'github' , 'o' , 'g' , 'qiwsir' ]) >>> s2.update(( 2 , 3 )) >>> s2 set ([ 2 , 3 , 'g' , 'o' , 'github' , 'qiwsir' ]) 所以,文档的寓意还是比较深刻的。 pop, remove, discard, clear >>> help ( set .pop) pop(...) Remove and return an arbitrary set element. Raises KeyError if the set is empty. >>> b_set set ([ '[1,2,3]' , 'h' , 'o' , 'n' , 'p' , 't' , 'qiwsir' , 'y' ]) >>> b_set.pop() #从set中任意选一个删除,并返回该值 '[1,2,3]' >>> b_set.pop() 'h' >>> b_set.pop() 'o' >>> b_set set ([ 'n' , 'p' , 't' , 'qiwsir' , 'y' ]) >>> b_set.pop( "n" ) #如果要指定删除某个元素,报错了. Traceback (most recent call last): File "<stdin>" , line 1 , in <module> TypeError: pop() takes no arguments ( 1 given) |
set.pop()是从set中任意选一个元素,删除并将这个值返回.但是,不能指定删除某个元素.报错信息中就告诉我们了,pop()不能有参数.此外,如果set是空的了,也报错.这条是帮助信息告诉我们的,看官可以试试.要删除指定的元素,怎么办?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | >>> help ( set .remove) remove(...) Remove an element from a set ; it must be a member. If the element is not a member, raise a KeyError. set .remove(obj)中的obj,必须是 set 中的元素,否则就报错.试一试: >>> a_set set ([ 'i' , 'a' , 'qiwsir' ]) >>> a_set.remove( "i" ) >>> a_set set ([ 'a' , 'qiwsir' ]) >>> a_set.remove( "w" ) Traceback (most recent call last): File "<stdin>" , line 1 , in <module> KeyError: 'w' 跟remove(obj)类似的还有一个discard(obj): >>> help ( set .discard) discard(...) Remove an element from a set if it is a member. If the element is not a member, do nothing |
与help(set.remove)的信息对比,看看有什么不同.discard(obj)中的obj如果是set中的元素,就删除,如果不是,就什么也不做,do nothing.新闻就要对比着看才有意思呢.这里也一样.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | >>> a_set.discard( 'a' ) >>> a_set set ([ 'qiwsir' ]) >>> a_set.discard( 'b' ) >>> 在删除上还有一个绝杀,就是 set .clear(),它的功能是:Remove all elements from this set .(看官自己在交互模式下 help ( set .clear)) >>> a_set set ([ 'qiwsir' ]) >>> a_set.clear() >>> a_set set ([]) >>> bool (a_set) #空了,bool一下返回False. False |
好记忆不如烂笔头
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术