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

创建集合set

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

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

创建空集合

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

  注意:想要创建空集合,你必须使用 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'}
  • setVar.discard(element)

    setVar :为一个set类型的变量

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

    函数作用:

    在集合setVar中查找element元素,如果存在则删除;如果没找到,则什么也不做。
>>> sList
set([1, 2, 3, 4, 5])
>>> sList.discard(1)
>>> sList
set([2, 3, 4, 5])
  • s.pop()

    s:为set类型的变量

    函数作用:

    删除并返回set类型的s中的一个不确定的元素,如果为空引发KeyError错误。
>>> sList
set([2, 3, 4, 5])
>>> sList.pop()
2
  • s.clear()

    s:set类型的变量

    函数作用:

    清空s集合中的所有元素
>>> sList
set([3, 4, 5])
>>> sList.clear()
>>> sList
set([])

集合的遍历

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

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

另一种遍历方式:

>>> s=set('one')
>>> s
{'e', 'o', 'n'}
>>> for idex,i in enumerate(s):
print (idex,i)
... ...
0 e
1 o
2 n
>>>

  变量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')
>>> st1
set(['h', 'o', 'n', 'p', 't', 'y'])
>>> st2 = set('htc')
>>> st2
set(['h', 'c', 't'])
>>> st1 & st2
set(['h', 't'])

并集(合集)

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

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

差集

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

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

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

集合的不同

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

  **s1.difference(s3) **

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

>>> s1
set([1, 2, 3, 4, 5])
>>> s2
set([1, 2, 3, 4])
>>> s1.difference(s2)
set([5])
>>> s3
set(['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 > s2
True
>>> s1 > s3
False
>>> s1 >= s2
True

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

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

>>> s2 < s1
True
>>> s1 < s3
False
>>> s3 < s1
False

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

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

>>> s1 == s2
False
>>> s2 == s3
False
>>> s1 != s2
True

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

不可变集合frozenset

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

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

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

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

Python的set集合详解的更多相关文章

  1. python之sys模块详解

    python之sys模块详解 sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和我一起走进python的模块吧! sys模块的常见函数列表 sys.argv: 实现从程序外部向程序传 ...

  2. Python数据类型及其方法详解

    Python数据类型及其方法详解 我们在学习编程语言的时候,都会遇到数据类型,这种看着很基础也不显眼的东西,却是很重要,本文介绍了python的数据类型,并就每种数据类型的方法作出了详细的描述,可供知 ...

  3. Python模块调用方式详解

    Python模块调用方式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其 ...

  4. python操作redis用法详解

    python操作redis用法详解 转载地址 1.redis连接 redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用 ...

  5. python之OS模块详解

    python之OS模块详解 ^_^,步入第二个模块世界----->OS 常见函数列表 os.sep:取代操作系统特定的路径分隔符 os.name:指示你正在使用的工作平台.比如对于Windows ...

  6. python中threading模块详解(一)

    python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...

  7. python引用和对象详解

    python引用和对象详解 @[马克飞象] python中变量名和对象是分离的 例子 1: a = 1 这是一个简单的赋值语句,整数 1 为一个对象,a 是一个引用,利用赋值语句,引用a指向了对象1. ...

  8. Python中time模块详解

    Python中time模块详解 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. ...

  9. Java 集合详解

    一.集合的由来 通常,我们的程序需要根据程序运行时才知道创建多少个对象.但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型.为了满足这些常规的编程需要,我们要 ...

随机推荐

  1. Hplsql报错:...HiveSQLExpection:Error while compiling statement:No privilege 'Select' found for inputs {.....}

    实践hplsql时,遇到的问题总结一下,若有不对的地方,欢迎交流. 一.Hplsql简介 hplsql的介绍详见:http://lxw1234.com/archives/2015/09/492.htm ...

  2. Mac显示同一程序的所有窗口

    通过F3键可以显示所有程序的所有窗口到桌面,但是如果窗口太多的话显示出来很难看清. 如果只显示某一个程序的所有窗口就不会乱了. 其实在dock上有一个相应的选项,但是没有快捷键. 开启方法: 在终端上 ...

  3. 第一章:CDib类库的建立

    VC++图像处理程序设计(第1版)    杨淑莹 编著     边奠英 主审 第一章 位图基础 Joanna-In-Hdu&Hust 手工打,印象更深刻 使用工具 VS2010 mfc  整本 ...

  4. 解题:HEOI 2015 最短不公共子串

    题面 制杖四合一,HEOI以前居然出这种**题,看来HE还是联考比较好= = 首先对第二个串建SAM 第一个简单,以每个位置为起点在SAM上走,失配时更新答案 第二个先在第二个串上预处理$firs[i ...

  5. 解题:POI 2009 Ticket Inspector

    题面 看起来很水,然而不会DP的蒟蒻并不会做,PoPoqqq orz 设$f[i][j]$表示当前在第$i$个点和第$i+1$个点之间查票,已经查了$j$次的最大收益.然后就是那种很常见的枚举前一个结 ...

  6. 【线性基/神仙题】P4151 [WC2011]最大XOR和路径

    Description 给定一个无向连通图,边有边权,求一个 \(1~\sim n\) 的路径,最大化边权的异或和.如果一条边经过多次则计算多次. Input 第一行是两个整数 \(n,m\) 代表点 ...

  7. OCR论文整理

    论文地址:https://github.com/ChanChiChoi/awesome-ocr 下面是已经看过的论文: CTPN CRNN TextBoxes EAST FOTS PixelLink

  8. web项目中配置文件的加载顺序

    当一个项目启动时,首先是web.xml: 这里面的配置: 为什么要在web.xml中配置struts的过滤器? 因为一个web项目运行的时需要加载的,或者默认的部分配置都会在web.xml中配置,中间 ...

  9. 在Vista操作系统中通过manifest文件使VC应用程序获得管理员权限

    原文 VC编译出来的应用程序在vista下运行,有可能因为权限问题,不能成功运行. 用以下办法,给应用程序添加一个manifest文件,程序运行时系统就会跳出UAC对话框,获得管理权限. 1.打开应用 ...

  10. python中的模块及路径

    python在import module的时候 是按照以下顺序去import一个module的: 1. 首先判断这个module是不是built-in即内建模块, 如果是则引入内建模块,如果不是则在一 ...