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

  概述


  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. IMP导入数据 报错 IMP-00058 ORA-01691 IMP-00028

    查看导入日志,发现错误如下: oracle@sspt:/back/log> cat imp.HD_HDXX.log Connected to: Oracle Database 11g Enter ...

  2. Cadence ORCAD CAPTURE元件库介绍

    Cadence ORCAD CAPTURE元件库介绍 来源:Cadence 作者:ORCAD 发布时间:2007-07-08 发表评论 Cadence  OrCAD  Capture 具有快捷.通用的 ...

  3. linux环境变量(转)

    转自: http://www.cnblogs.com/growup/archive/2011/07/02/2096142.html Linux 的变量可分为两类:环境变量和本地变量 环境变量 或者称为 ...

  4. Getting Started Synchronizing Files

    https://msdn.microsoft.com/en-US/library/bb902813(v=sql.110).aspx Sync Framework includes a file syn ...

  5. [HIHO1260]String Problem I(trie树)

    题目链接:http://hihocoder.com/problemset/problem/1260 n个字符串,m次询问.每次询问给一个字符串,问这个字符串仅可以在一个地方加一个字母.这样操作后与n个 ...

  6. HDFS的java操作方式

    1.RPC 1.1 RPC (remote procedure call)远程过程调用. 远程过程指的是不是同一个进程. 1.2 RPC至少有两个过程.调用方(client),被调用方(server) ...

  7. windows平台时间函数性能比较QueryPerformanceCounter,GetTickCount,ftime,time,GetLocalTime,GetSystemTimeAsFileTime

    http://gmd20.blog.163.com/blog/static/168439232012113111759514/ 执行 10000000 次, 耗时 2258,369 微秒     Qu ...

  8. linq to sql ,将var 类型转为 IList 类型

    public void SOHSelecting(int startRowIndex, int maximumRows, string sortExpression, string location) ...

  9. 51nod1294 修改数组

    看题解的...就是将必须要修改的数去掉后求最长的不递减子序列. upper_bound+lower_bound要理解.有时候-1有时候不用是有原因的. #include<cstdio> # ...

  10. qt多文档

    http://blog.csdn.net/siren0203/article/details/5661541