• 概述
  • 集合的一般操作
  • 内建函数进行标准操作集合
  • 数学运算符进行标准操作集合
  • 集合的应用

  概述


  python的集合(set)是无序不重复元素集,是一种容器。集合(set)中的元素必须是不可变对象,即可用被哈希,这和字典的键是一样的,所以列表、字典等可变对象不可作为set的元素。集合不提供索引或切片操作,即对象不存在相关的键值。python中的集合分为两种:set是可变的集合,frozenset是不可变的集合。

  集合的创建使用关键字set或frozenset, 参数可以是列表、字符串或元组等不可变对象。

  • 可变集合set
>>> s1=set("abcdef")
>>> s2=set(['a','b','c','d','e'])
>>> s3=set(('a','b','c','d','e'))
>>> s1,s2,s3
(set(['a', 'c', 'b', 'e', 'd', 'f']), set(['a', 'c', 'b', 'e', 'd']), set(['a', 'c', 'b', 'e', 'd']))
  • 不可变集合frozenset
>>> fs1=frozenset([1,2,3])
>>> fs2=frozenset((1,2,3))
>>> fs3=frozenset("")
>>> fs1,fs2,fs3
(frozenset([1, 2, 3]), frozenset([1, 2, 3]), frozenset(['', '', '']))

集合的一般操作


1. 获取集合元素

s=set([1,2,3,4,5])
L = len(s) #L=5

2. 获取集合的副本s.copy()

  s.copy()获取到的副本和使用s1=s方式获得的集合是不一样的。s1=s得到的s1和s指向的是同一个集合,Python并没有为s1新开辟一块内存并把s拷贝过去,s1和s指向的是同一块内存。而s.copy()方式会在内存中新建一个set并把s的值拷贝过去。

>>> s=set([1,2,3])
>>> s1=s
>>> s2=s.copy()
>>> id(s),id(s1),id(s2)
(40826920L, 40826920L, 40825800L)

  从上面的例子中我们可以看到,s和s1的id是相同的,表明它们指向同一块内存,而s2的id则和它们不同.

3.增加元素s.add(item)

>>> s = set([1,2,3])
>>> s.add(4)
>>> s
set([1, 2, 3, 4])

4.随机删除元素s.pop()

  s.pop()返回任意的集合元素,并将其从s中删除

set([1, 2, 3, 4])
>>> s = set([1,2,3])
>>> s.pop()
1
>>> s
set([2, 3])

5.删除指定元素 s.remove(item)和s.discard(item)

  s.remove(item)从s中删除item,如果item不是s的成员,则引发KeyError异常。

>>> s = set([1,2,3])
>>> s.remove(2)
>>> s
set([1, 3])

>>> s.remove(4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 4

  s.discard(item)删除item,如果s中不存在item,则没有效果,不会引发异常.

>>> s = set([1,2,3])
>>> s.discard(2)
>>> s
set([1, 3])
>>> s.discard(4)
>>> s
set([1, 3])

6.删除所有元素s.clear() 

>>> s = set([1,2,3])
>>> s.clear()

7.更新集合s.update(t)

  s.update(t)将t中的所有项添加到s中,t可以是另外一个集合、序列或支持迭代的任意对象,t也可以是字典,如果是字典的话则只是将字典的键加入到集合s中。  

>>> s = set([1,2,3])
>>> t = set([4,5,6]) #t是集合
>>> s.update(t)
>>> s
set([1, 2, 3, 4, 5, 6])

#t是元组
>>> s.update((7,8,9))
>>> s
set([1, 2, 3, 4, 5, 6, 7, 8, 9]) #t是列表
>>> s.update([10,11,12])
>>> s
set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) #t是字典
>>> s.update({"a":13,"b":14})
>>> s
set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 'a', 'b'])

8. 判断集合中是否存在某元素,in , not in 

>>> s = set([1,2,3,4])
>>> 1 in s
True
>>> 1 not in s
False

使用内建函数操作集合


集合的标准操作包括集合的交集、并集、差集和对称差操作,下面举例解释下。

  假设s=[1,2,3,4],t=[3,4,5,6]

  交集:既在s又在t中的元素, 操作结果为[3,4].

  并集: s中或t中的元素,操作结果为[1,2,3,4,5,6].

  差集: 只在s中的元素,操作结果为[1,2].

  对称差:s中或t中的元素,但是不同在这两个集合中的元素.

  子集:如果s的元素在t中都有,则s是t的子集.

  超集: 如果s包含t中的所有元素,则s是t的超集合.

Python的集合操作的结果与最左边的操作数具有相同的类型,所以如果s是一个frozennet,而t是一个set,则结果将是frozennet。Python的集合操作可以使用集合的内建函数,也可以使用数学操作符。

由于Python的集合分为可变集合set和不可变集合frozenset两种,所以Python集合的内建函数的集合标准操作也分为两种。一种是set和frozenset都支持的,直接返回操作结果。另一种是仅set支持的操作,可以更改当前集合。

  1. 不改变集合的标准操作

  • s.intersection(t):交集.
  • s.union(t):并集.
  • s.difference(t):差集.
  • s.symmetric_difference(t):对称差.
  • s.issubset(t):如果s是t的子集,返回True.
  • s.issuperset(t):如果s是t的超集,返回True.
  • d.isdisjoint(t):如果s和t没有共同项,则返回True  
>>> s = set([1,2,3,4]);t = set([3,4,5,6])

#交集
>>> s.intersection(t)
set([3, 4]) #并集
>>> s.union(t)
set([1, 2, 3, 4, 5, 6]) #差集
>>> s.difference(t)
set([1, 2]) #对称差
>>> s.symmetric_difference(t)
set([1, 2, 5, 6]) #判断子集
>>> set([1,2]).issubset(s)
True #判断超集
>>> s.issuperset(set([1,2]))
True #判断有没有共同项
>>> s.isdisjoint(t)
False

  2. 改变集合的操作:

  • s.intersection_update(t):交集
  • s.difference_update(t):差集
  • s.symmetric_difference_update(t):对称差

  这三个函数会将操作的结果写入到集合s中。

>>> s = set([1,2,3,4]);t = set([3,4,5,6])

#交集
>>> s.intersection_update(t)
>>> s
set([3, 4]) #差集
>>> s.difference_update(t)
>>> s
set([1, 2]) #对称差
>>> s = set([1,2,3,4]);t = set([3,4,5,6])
>>> s.symmetric_difference_update(t)
>>> s
set([1, 2, 5, 6])

数学运算符进行标准操作集合


  支持的数学运算符操作如下:

  s | t : 并集

  s & t : 交集

  s - t: 差集

  s ^ t: 对称差

  s < t: 如果s是t的子集返回True,否则False.

  s > t: 如果s是t的超集返回True,否则返回False.

  s == t: s和t相等返回True,否则False.

>>> s = set([1,2,3,4]); t = set([3,4,5,6])
>>> s & t
set([3, 4])
>>> s | t
set([1, 2, 3, 4, 5, 6])
>>> s - t
set([1, 2])
>>> s ^ t
set([1, 2, 5, 6])
>>> set([1,2]) < s
True
>>> t > set([3,4,5])
True
>>> s == t
False
  • 可变集合类型的方法和操作

  集合操作符


  集合的内建函数


  集合的应用


【Python学习笔记】集合的更多相关文章

  1. Python学习笔记——集合类型

    集合类型有两种不同的类型——可变集合(set)和不可变集合(frozenset) 可变集合不是可哈希的,不能用作字典的键,也不能用做其他集合中的元素 不可变集合是有哈希值的,能被用做字典的键或者是作为 ...

  2. Python学习笔记——集合

    1. 定义 num = {} print(type(num)) num2 = {1,2,3,4,5} print(type(num2)) <class 'dict'> <class ...

  3. python学习笔记整理——字典

    python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...

  4. OpenCV之Python学习笔记

    OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...

  5. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

  6. Python学习笔记(七)

    Python学习笔记(七): 深浅拷贝 Set-集合 函数 1. 深浅拷贝 1. 浅拷贝-多层嵌套只拷贝第一层 a = [[1,2],3,4] b = a.copy() print(b) # 结果:[ ...

  7. Python学习笔记(八)

    Python学习笔记(八): 复习回顾 递归函数 内置函数 1. 复习回顾 1. 深浅拷贝 2. 集合 应用: 去重 关系操作:交集,并集,差集,对称差集 操作: 定义 s1 = set('alvin ...

  8. 【python学习笔记】9.魔法方法、属性和迭代器

    [python学习笔记]9.魔法方法.属性和迭代器 魔法方法:xx, 收尾各有两个下划线的方法 __init__(self): 构造方法,创建对象时候自动执行,可以为其增加参数, 父类构造方法不会被自 ...

  9. 【python学习笔记】5.条件、循环和其他语句

    [python学习笔记]5.条件.循环和其他语句 print: 用来打印表达式,不管是字符串还是其他类型,都输出以字符串输出:可以通过逗号分隔输出多个表达式 import: 导入模块     impo ...

  10. Deep learning with Python 学习笔记(9)

    神经网络模型的优化 使用 Keras 回调函数 使用 model.fit()或 model.fit_generator() 在一个大型数据集上启动数十轮的训练,有点类似于扔一架纸飞机,一开始给它一点推 ...

随机推荐

  1. TCP连接探测中的Keepalive 和心跳包

    采用TCP连接的C/S模式软件,连接的双方在连接空闲状态时,如果任意一方意外崩溃.当机.网线断开或路由器故障,另一方无法得知TCP连接已经失效,除非继续在此连接上发送数据导致错误返回.很多时候,这不是 ...

  2. [置顶] Android Provision (Setup Wizard)

    Android中很多框架性的设计都已经存在了,但在市场上的发布版本里却因为没有很好的理解Android的设计意图而进行自己的定制,或者自己又做一 个冗余的实现.Android中的Provision其实 ...

  3. Miller_Rabin (米勒-拉宾) 素性测试

    之前一直对于这个神奇的素性判定方法感到痴迷而又没有时间去了解.借着学习<信息安全数学基础>将素性这一判定方法学习一遍. 首先证明一下费马小定理. 若p为素数,且gcd(a, p)=1, 则 ...

  4. 关于Qt

    什么是Qt Qt是一个针对桌面.嵌入式.移动设备的一个跨平台的应用程序开发框架,支持的平台包括Linux.OS X.Windows.VxWorks.QNX.Android.iOS.BlackBerry ...

  5. mysql JDBC URL格式各个参数详解

    mysql JDBC URL格式如下: jdbc:mysql://[host:port],[host:port].../[database][?参数名1][=参数值1][&参数名2][=参数值 ...

  6. HDU 1394 (逆序数) Minimum Inversion Number

    原来求逆序数还可以用线段树,涨姿势了. 首先求出原始序列的逆序数,然后递推每一个序列的逆序数. #include <cstdio> #include <cstring> #in ...

  7. 【转】很有用但鲜有人知的 Linux 命令

    Linux命令行吸引了大多数Linux爱好者.一个正常的Linux用户一般掌握大约50-60个命令来处理每日的任务.Linux命令和它们的转换对于Linux用户.Shell脚本程序员和管理员来说是最有 ...

  8. linux shared lib 使用与编译

    一.              动态链接库的原理及使用 Linux提供4个库函数.一个头文件dlfcn.h以及两个共享库(静态库libdl.a和动态库libdl.so)支持动态链接. Ø        ...

  9. scala学习笔记(9):Scala函数(2)

    1 指令式编程&函数式编程 指令式:imperative 风格编程.指令式风格,是你常常使用像 Java,C++和 C 这些语言里用的风格,一次性发出一个指令式的命令,用循环去枚举,并经常改变 ...

  10. dede 字符串截取

    [field:description function="( strlen(strip_tags('@me',''))>100 ? cn_substr(strip_tags('@me' ...