Python中,内置类型set和frozenset用来表示集合,我们首先查看这两个类型支持的特殊对象,从而可以理解他们的特性。

>>> dir(set)
['__and__', '__class__', '__cmp__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', ...]
>>>
>>> dir(frozenset)
['__and__', '__class__', '__cmp__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', ...]

set类型支持:

  • x in s :判断x是否在s中,因为set对象支持特殊方法__contains__()
  • len(s):计算set对象中元素的个数,因为set对象支持特殊方法__len__()
  • for x in s :遍历s,即s是可迭代的,因为set对象支持特殊方法__iter__()

set类型的对象不支持:

  • 索引(indexing):试图执行s[0]之类的操作将会抛出异常TypeError
  • 切片(slice):试图执行s[:]之类的操作将会抛出异常TypeError,因为可以看到set类型并不支持特殊方法__getitem__()
  • 哈希(hash):因为set对象的__hash__()方法是None,等于不支持。

此外,Python中另一个重要的内置类型是frozenset:

  • frozenset对象是不可变的(即不支持set对象的那些 mutating 方法)
  • frozenset对象有哈希值(从而可以作为字典的键和其他set对象的元素)。

例1. frozenset类型支持的非特殊方法

>>> dir(frozenset)
[..., 'copy', 'difference', 'intersection', 'isdisjoint', 'issubset', 'issuperset', 'symmetric_difference', 'union']
>>> dir(set)
[..., 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']

  可见frozenset支持与set相同的non-mutating方法,而set支持的可变方法,frozenset则不支持。

  

例2. 对frozenset与set类型进行哈希运算的结果

>>> s1 = frozenset('123')
>>> s2 = set('123')
>>> hash(s1)
-98267375
>>> hash(s2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'

  可见frozenset是hashable对象,可以作为字典的键

例3. 将frozenset和set实例作字典键

>>> d= {s1:1}
>>> d= {s2:2}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'

例4. 为什么set对象是不可哈希的

>>> dir(set)
['__and__', '__class__', '__cmp__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__
, '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__ior__', '__isub__'
'__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__',
__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__size
f__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'd
fference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issu
erset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']
>>> type(set.__hash__)
<type 'NoneType'>

  我们看到,原来set对象没有__hash__()方法(__hash__方法是个None对象),所以它并不支持哈希运算。

non-mutating方法

s.copy()

  返回集合s的浅拷贝。

s.difference(s1)

  返回集合s中不在集合s1中的元素的集合,即s-s1。

s.intersection(s1)

  返回s与s1的交集。即s&s1.

s.issubset(s1)

  判断s是不是s1的子集。

s.issuperset(s1)

  判断s是不是s1的超集。

s.symmetric_difference(s1)

  返回由要么在s中,要么在s1中,但不同时在s和s1中的元素组成的集合。即s^s1。

例:对称差集

 >>> s
set([1, 2, 3, 5])
>>> s1
set([1, 2, 3, 4])
>>> s.symmetric_difference(s1)
set([4, 5])
s.union(s1)

  返回s和s1的并集。即s|s1。

mutating 方法

s.add(x)

  将x添加到集合s中,如果s中已经有x,则该操作没有影响。

s.clear()

  清空集合s。

s.discard(x)

  从集合s中删除x,如果x不在s中,该操作没有影响。

s.pop()

  返回并删除集合s中的任意一个元素。

s.remove(x)

  区别于s.discard(x),当x在集合S中时,二者效果相同,但当x不在集合S中时,remove(x)抛出异常:KeyError;而discard(x)没有影响。

s.difference_update(s1)

  即:s -= s1

s.intersection_update(s1)

  即:s &= s1

s.symmetric_difference_update(s1)

  即:s ^= s1

s.update(s1)

  即:s |= s1

  使用运算符进行集合的运算和使用函数的功能相同,当使用(增强)运算符时,两端的运算数都得是set或frozenset,

  使用函数进行集合运算时,s1只要是元素可哈希的可迭代对象就行。

Python内置类型——set的更多相关文章

  1. Python内置类型性能分析

    Python内置类型性能分析 timeit模块 timeit模块可以用来测试一小段Python代码的执行速度. class timeit.Timer(stmt='pass', setup='pass' ...

  2. Python 内置类型 dict, list,线程安全吗

    近段时间发现一个 Python 连接数据库的连接是线程不安全的,结果惹得我哪哪儿都怀疑变量的多线程是否安全的问题,今天终于找到了正确答案,那就是 Python 内置类型 dict,list ,tupl ...

  3. 为什么继承 Python 内置类型会出问题?!

    本文出自"Python为什么"系列,请查看全部文章 不久前,Python猫 给大家推荐了一本书<流畅的Python>(点击可跳转阅读),那篇文章有比较多的"溢 ...

  4. Python——内置类型

    Python定义了丰富的数据类型,包括: 数值型:int, float, complex 序列:(iterable) str, unicode, tuple, list, bytearray, buf ...

  5. 易被忽略的Python内置类型

    Python中的内置类型是我们开发中最常见的,很多人都能熟练的使用它们. 然而有一些内置类型确实不那么常见的,或者说往往会被我们忽略,所以这次的主题就是带领大家重新认识这些"不同寻常&quo ...

  6. 3、python内置类型(0529)

    python的内置对象类型以及支持的运算 python对象的相关术语 python程序中保存的所有数据都是围绕对象这个概念展开的 程序中存储的所有数据都是对象 每个对象都有一个身份.一个类型和一个值 ...

  7. python内置类型详细解释

    文章编写借鉴于内置类型 - Python 3.7.3 文档,主要用于自己学习和记录 python主要内置类型包括数字.序列.映射.类.实例和异常 有些多项集类是可变的.它们用于添加.移除或重排其成员的 ...

  8. Python内置类型(4)--数值

    Python有以下三种的数值类型: 整型(integers), 浮点型(floating point numbers), 以及 复数(complex numbers).此外,布尔是整数的子类型. 数值 ...

  9. Python内置类型——list

    list(列表)是Python内置的可变序列(Sequence)类型,list的对象的方法也都是就地(in-place)更改调用这些方法的列表对象, List的一些细节 可以直接为list的某个下标赋 ...

随机推荐

  1. 树上统计treecnt(dsu on tree 并查集 正难则反)

    题目链接 dalao们怎么都写的线段树合并啊.. dsu跑的好慢. \(Description\) 给定一棵\(n(n\leq 10^5)\)个点的树. 定义\(Tree[L,R]\)表示为了使得\( ...

  2. C++的多态

    继承.封装.多态是面向对象编程最主要的三个特征,有人说多态是理解C++最难理解的一部分,其实我觉得单单从技术上讲,多态并不难,难的是你需要懂得在何时使用多态,就像封装一样,封装本身不难,难的是你对整个 ...

  3. linux sendmail 发送缓慢的问题

    这个问题关键就是hosts里面对于本机host的设置有问题,你可以看下/var/log/mail.log retry 和 sleeping,再加上其他时间,用sendmail发送邮件等这么久,太累了吧 ...

  4. window 7喇叭有红叉,耳机扬声器已拔出驱动无法修复

    win7系统没声音前提是声卡驱动已经安装完全,且没有问题.Windows 7系统电脑有耳机的存在,但是还是显示扬声器耳机或耳机已拔出 ,未修复故障,首先可以百度下看下其他教程,尝试过还是不行的时候,可 ...

  5. ITxlab倡议启动“互联网X大脑”计划

    导语:"互联网X大脑"计划由ITxlab(互联网X实验室)联合科学院相关机构.基于7年以来取得的研究成果,倡议建立的互联网与脑科学前沿研究平台,吸引不同领域专家进行科学研究和成果交 ...

  6. php实现查询上传文件进度

    参考:http://www.ultramegatech.com/2010/10/create-an-upload-progress-bar-with-php-and-jquery/ 11OCT/108 ...

  7. 使用Maven自动部署Java Web项目到Tomcat问题小记

    导读 首先说说自己为啥要用maven管理项目,一个直接的原因是:我在自己电脑上开发web项目,每次部署到服务器上时都要经历如下步骤: 首先在Eclipse里将项目打包成war包 将服务器上原来的项目文 ...

  8. Linux 保护文件 不给修改

    chatter +i  file 文件不能删除,不能更改,不能移动 chatter -i  file  恢复 lsattr file 查看 ----i--------e-- file 修改会提示: f ...

  9. python 常见问题

    C:\Users\user\AppData\Local\Programs\Python\Python36\Scripts\ C:\Users\user\AppData\Local\Programs\P ...

  10. log4net.Layout.PatternLayout 用 conversion 模式格式化日志事件【翻译】

    原文地址 log4net.Layout.PatternLayout,是一个灵活的布局,配置模式字符串. 线程安全.该类型的 Public static 成员对多线程操作是安全的.实例成员不保证线程安全 ...