Python中,集合对象是一组无序排列的可哈希的值。所以集合成员可以做字典中的键。集合中的元素都是唯一的。

集合(sets)有两种不同的类型,可变集合(set) 和 不可变集合(frozenset)。对可变集合(set),可以添加和删除元素,对不可变集合(frozenset)则不允许这样做。

请注意,可变集合(set)不是可哈希的,因此既不能用做字典的键也不能做其他集合中的元素。不可变集合(frozenset)则正好相反,即,他们有哈希值,能被用做字典的键或是作为集合中的一个成员。

一:创建集合类型

集合与列表( [ ] )和字典( { } ) 不同,没有特别的语法格式。集合的工厂方法 set() 和 frozenset(),是创建集合的唯一方法:

  1. >>> s = set('cheeseshop')
  2. >>> s
  3. set(['c', 'e', 'h', 'o', 'p', 's']) #注意,只有一个'e'
  4.  
  5. >>> t = frozenset('bookshop')
  6. >>> t
  7. frozenset(['b', 'h', 'k', 'o', 'p', 's'])

二:访问集合中的值

集合不支持索引访问:

  1. >>> asd
  2. set(['a', 'c', 'b', 'e', 'd'])
  3.  
  4. >>> asd[1]
  5. Traceback (most recent call last):
  6. File "<stdin>", line 1, in<module>
  7. TypeError: 'set' object does not supportindexing

可以遍历查看集合成员或检查某项元素是否是一个集合中的成员:

  1. >>> for i in s:
  2. ... print i
  3. ...
  4. c
  5. e
  6. h
  7. o
  8. p
  9. s

三:更新集合

用各种集合内建的方法和操作符添加和删除集合的成员:

  1. >>> s.add('z')
  2. >>> s
  3. set(['c', 'e', 'h', 'o', 'p', 's', 'z'])
  4. >>> s.update('pypi')
  5. >>> s
  6. set(['c', 'e', 'i', 'h', 'o', 'p', 's','y', 'z'])
  7. >>> s.remove('z')
  8. >>> s
  9. set(['c', 'e', 'i', 'h', 'o', 'p', 's','y'])
  10. >>> s -= set('pypi')
  11. >>> s
  12. set(['c', 'e', 'h', 'o', 's'])

只有可变集合能被修改。试图修改不可变集合会引发异常:

  1. >>> t.add('z')
  2. Traceback (most recent call last):
  3. File "<stdin>", line 1, in?
  4. AttributeError: 'frozenset' object has noattribute 'add'

四:集合类型操作符

1:标准类型操作符,适合所有的集合类型

成员关系(in, not in):

  1. >>> s = set('cheeseshop')
  2. >>> t = frozenset('bookshop')
  3. >>> 'k' in s
  4. False
  5.  
  6. >>> 'k' in t
  7. True
  8.  
  9. >>> 'c' not in t
  10. True

集合等价/不等价

等价/不等价被用于在相同或不同的集合之间做比较。两个集合相等是指,对每个集合而言,当且仅当其中一个集合中的每个成员同时也是另一个集合中的成员。集合等价/不等价与集合的类型或集合成员的顺序无关,只与集合的元素有关。

  1. >>> s == t
  2. False
  3.  
  4. >>> s != t
  5. True
  6.  
  7. >>> u = frozenset(s)
  8. >>> s == u
  9. True
  10.  
  11. >>> set('posh') == set('shop')
  12. True

子集/超集

用比较操作符检查某集合是否是其他集合的超集或子集。“小于”符号( <, <= )用来判断子集,“大于”符号( >, >= )用来判断超集。

  1. >>> set('shop') <set('cheeseshop')
  2. True
  3.  
  4. >>> set('bookshop') >=set('shop')
  5. True

2:集合类型操作符,适合所有的集合类型

联合( | )

两个集合的联合是一个新集合,该集合中的每个元素都至少是其中一个集合的成员。联合符号有一个等价的方法:union().

  1. >>> s | t
  2. set(['c', 'b', 'e', 'h', 'k', 'o', 'p','s'])

交集( & )

两个集合的交集是一个新集合,该集合中的每个元素同时是两个集合中的成员,交集符号有一个等价的方法:intersection().

  1. >>> s & t
  2. set(['h', 's', 'o', 'p']

差补/相对补集( – )

两个集合(s和t)的差补或相对补集是指一个集合C,该集合中的元素,只属于集合s,而不属于集合t。差符号有一个等价的方法:difference().

  1. >>> s - t
  2. set(['c', 'e'])

对称差分( ^ )

两个集合(s和t)的对称差分是指另外一个集合C,该集合中的元素,只能是属于集合s 或者集合t的成员,不能同时属于两个集合。对称差分有一个等价的方法:symmetric_difference().

  1. >>> s ^ t
  2. set(['k', 'b', 'e', 'c'])

混合集合类型操作

上面的示例中,左边的s是可变集合,而右边的t是一个不可变集合.使用集合操作运算符所产生的仍然是可变集合,但是如果左右操作数的顺序反过来,结果就不一样了。

        如果左右两个操作数的类型相同,则所产生的结果类型是相同的,但如果左右两个操作数的类型不相同,则所产生的结果类型与左操作数的类型相同。

还要注意,加号不是集合类型的运算符:

  1. >>> t | s
  2. frozenset(['c', 'b', 'e', 'h', 'k', 'o','p', 's'])
  3. >>> t ^ s
  4. frozenset(['c', 'b', 'e', 'k'])
  5. >>> t - s
  6. frozenset(['k', 'b'])
  7. >>> v = s + t
  8. Traceback (most recent call last):
  9. File "<stdin>", line 1, in?
  10. TypeError: unsupported operand type(s) for+: 'set' and 'set'
  11. >>> v = s | t
  12. >>> v
  13. set(['c', 'b', 'e', 'h', 'k', 'o', 'p','s'])
  14. >>> len(v)
  15. 8
  16. >>> s < v
  17. True

3 集合类型操作符,仅适用于可变集合

(Union)Update ( |= )

这个更新方法从已存在的集合中添加(可能多个)成员,此方法和update()等价.

  1. >>> s = set('cheeseshop')
  2. >>> s |= set('pypi')
  3. >>> s
  4. set(['c', 'e', 'i', 'h', 'o', 'p', 's','y'])

保留/交集更新( &= )

保留(或交集更新)操作保留与其他集合的共有成员。此方法和intersection_update()等价.

  1. >>> s = set(u)
  2. >>> s &= set('shop')
  3. >>> s
  4. set(['h', 's', 'o', 'p'])

差更新 ( -= )

对集合s和t 进行差更新操作s-=t,差更新操作是集合s去除掉集合t中元素。此方法和difference_update()等价.

  1. >>> s = set(u)
  2. >>> s -= set('shop')
  3. >>> s
  4. set(['c', 'e'])

对称差分更新( ^= )

对集合s和t 进行对称差分更新操作(s^=t),对称差分更新操作会返回一个集合,该集合中的成员仅是原集合s 或仅是另一集合t 中的成员。此方法和symmetric_difference_update()等价.

  1. >>> s = set(u)
  2. >>> t = frozenset('bookshop')
  3. >>> s ^= t
  4. >>> s
  5. set(['c', 'b', 'e', 'k'])

五:集合类型内建方法

1:适于所有集合的方法

已看到很多和内建方法等价的操作符,如下表:

方法名称

操作

s.issubset(t)

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

s.issuperset(t)

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

s.union(t)

返回一个新集合,该集合是s和t的并集

s.intersection(t)

返回一个新集合,该集合是s和t的交集

s.difference(t)

返回一个新集合,该集合是s的成员,但不是t的成员

s.symmetric_difference(t)

返回一个新集合,该集合是s或t的成员,但不是s和t共有的成员

s.copy()

返回一个新集合,它是集合s的浅复制

内建方法copy()没有等价的操作符。copy()方法比用像set(),frozenset(),这样的工厂方法复制对象的副本要快。

2:仅适用于可变集合的方法

方法名

操作

s.update(t)

用t中的元素修改s, s现在包含s或t的成员

s.intersection_update(t)

s中的成员是共同属于s和t的元素。

s.difference_update(t)

s中的成员是属于s但不包含在t中的元素

s.symmetric_difference_update(t)

s中的成员更新为那些包含在s或t中,但不是s和t共有的元素

s.add(obj)

在集合s中添加对象obj

s.remove(obj)

从集合s中删除对象obj;如果obj不是集合s中的元素,将引发KeyError错误

s.discard(obj)

如果obj是集合s中的元素,从集合s中删除对象obj;

s.pop()

删除集合s中的任意一个对象,并返回它

s.clear()

删除集合s中的所有元素

新的方法有 add(), remove(), discard(), pop(), clear(). 这些接受对象的方法,参数必须是可哈希的。

3:操作符和内建方法比较

很多内建的方法几乎和操作符等价。我们说"几乎等价",意思是它们间是有一个重要区别:当用操作符时,操作符两边的操作数必须是集合。 在使用内建方法时,对象也可以是迭代类型的。

        4:总结

所有集合类型

len(s)

集合基数: 集合s中元素的个数

set([obj])

可变集合工厂函数:obj 必须是支持迭代的,由obj 中的元素创建集合,否则创建一个空集合。

frozenset([obj])

不可变集合工厂函数:执行方式和set()方法相同,但它返回的是不可变集合

obj in s

成员测试:obj 是s 中的一个元素吗?

obj not in s

非成员测试:obj 不是s 中的一个元素吗?

s == t

等价测试: 测试s 和t 是否具有相同的元素?

s != t

不等价测试: 与==相反

s.issubset(t)

s < t

(严格意义上)子集测试; s != t 而且s 中 所 有的元素都是t 的成员

s <= t

子集测试(允许不严格意义上的子集): s 中所有的元素都是t 的成员

s.issuperset(t)

s > t

(严格意义上)超集测试: s != t 而且t 中所有的元素都是s 的成员

s >= t

超集测试(允许不严格意义上的超集):t中所有的元素都是s的成员

s.union(t)

s | t

合并操作:s或t中的元素(返回新集合)

s.intersection(t)

s & t

交集操作:s和t中的元素(返回新集合)

s.difference(t)

s - t

差分操作: s 中的元素,而不是t 中的元素(返回新集合)

s.symmetric_difference(t)

s ^ t

对称差分操作:s 或t 中的元素,但不是s和t 共有的元素(返回新集合)

s.copy()

复制操作:返回s的(浅复制)副本

仅用于可变集合

s.update(t)

s |= t

(Union) 修改操作: 将t中的成员添加到s

s.intersection_update(t)

s &= t

交集修改操作: s 中仅包括s 和t 中共有的成员

s.difference_update(t)

s -= t

差修改操作: s 中包括仅属于s 但不属于t 的成员

s.symmetric_difference_update(t)

s ^= t

对称差分修改操作: s 中包括仅属于s 或仅属于t 的成员

s.add(obj)

加操作: 将obj 添加到s

s.remove(obj)

删除操作: 将obj 从s 中删除;如果s 中不存在obj,将引发KeyError

s.discard(obj)

丢弃操作: remove()的友好版本,如果s中存在obj,从s中删除它

s.pop()

Pop 操作: 移除并返回s中的任意一个元素

s.clear()

清除操作: 移除s 中的所有元素

Python基础:05集合类型的更多相关文章

  1. python 基础 set 集合类型补充

    为啥今天又重提这个数据类型呢?平时用的少,等要用起来的时候才发现,自己对这块啥都不知道了,so,今天就把这块再梳理一下咯. 一.set集合,是一个无序且不重复的元素集合.这一点是非常重要的. 二.集合 ...

  2. Python中的集合类型分类和集合类型操作符解析

    集合类型    数学上,把set称作由不同的元素组成的集合,集合(set)的成员通常被称作集合元素(set elements).    Python把这个概念引入到它的集合类型对象里.集合对象是一组无 ...

  3. python基础数据类型--集合(set)

    python基础数据类型--集合(set) 集合是一个数学概念由一个或多个确定的元素所构成的整体叫做集合 集合中的三个特征 1.确定性(元素必须死可hash) 2.互异性(去重) 3.无序性(集合中的 ...

  4. python基础之序列类型的方法——字符串方法

    python基础之序列类型的方法--字符串方法 Hello大家好,我是python学习者小杨同学,经过一段时间的沉淀(其实是偷懒不想更新),我终于想起了自己的博客账号,所以这次带来的是序列方法的后半部 ...

  5. python基础之数值类型与序列类型

    Hello大家好,我是python学习者小杨同学,已经学习python有一段时间,今天将之前学习过的内容整理一番,在这与大家分享与交流,现在开始我们的python基础知识之旅吧. 数值类型与序列类型 ...

  6. python set type 集合类型的数据介绍 (set frozenset)

      python支持数学中的集合概念,如:通过in,not in 可以检查某元素是否在,不在集合中. python有两种集合类型,set(可以变的,不能哈希,不能用作字典的key),frozenset ...

  7. Python基础操作-集合

    在Python set是基本数据类型的一种集合类型,它有可变集合(set())和不可变集合(frozenset)两种.创建集合set.集合set添加.集合删除.交集.并集.差集的操作都是非常实用的方法 ...

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

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

  9. Swift 学习- 05 -- 集合类型

    // 集合类型 // swift 提供 Arrays , Sets 和 Dictionaries 三种基本的集合类型用来存储数据 , 数组(Arrays) 是有序数据的集, 集合(Sets)是无序无重 ...

随机推荐

  1. 通过gevent实现单线程下的多socket并发

    #通过gevent实现单线程下的多socket并发 服务器 #server side import sys import socket import time import gevent from g ...

  2. TZ_07_SSM整合

    1.坐标版本控制: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...

  3. C# WPF 仿QQ靠近屏幕上方自动缩起功能实现

    碰到了类似需求,但是上网查了一圈发现感觉要么很复杂,要么代码很臃肿,索性自己实现了一个 几乎和QQ是一模一样的效果,而且核心代码只有20行左右. 代码如下: using System; using S ...

  4. Java问题解读系列之IO相关---Java深拷贝和浅拷贝

    前几天和棒棒童鞋讨论Java(TA学的是C++)的时候,他提到一个浅拷贝和深拷贝的问题,当时的我一脸懵圈,感觉自己学Java居然不知道这个知识点,于是今天研究了一番Java中的浅拷贝和深拷贝,下面来做 ...

  5. Python3入门机器学习 经典算法与应用

    Python3入门机器学习 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时候可以关注下 ...

  6. 玩转Spring Boot 自定义配置、导入XML配置与外部化配置

    玩转Spring Boot 自定义配置.导入XML配置与外部化配置       在这里我会全面介绍在Spring Boot里面如何自定义配置,更改Spring Boot默认的配置,以及介绍各配置的优先 ...

  7. Java IO:字节流与字符流

    https://blog.csdn.net/my_truelove/article/details/53758412 字符和字节之间可以互相转化,中间的参照就是编码方式. 相当于给你一个密码本,按照这 ...

  8. Django项目:CRM(客户关系管理系统)--10--04PerfectCRM实现King_admin注册功能02

    from django import conf #配置文件print("dj conf:",conf) #配置文件print("dj conf:",conf.s ...

  9. Python 运算符首尾匹配

  10. 纯CSS3实现Metro Icon

    在线演示 本地下载