Python内置类型——set
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的更多相关文章
- Python内置类型性能分析
Python内置类型性能分析 timeit模块 timeit模块可以用来测试一小段Python代码的执行速度. class timeit.Timer(stmt='pass', setup='pass' ...
- Python 内置类型 dict, list,线程安全吗
近段时间发现一个 Python 连接数据库的连接是线程不安全的,结果惹得我哪哪儿都怀疑变量的多线程是否安全的问题,今天终于找到了正确答案,那就是 Python 内置类型 dict,list ,tupl ...
- 为什么继承 Python 内置类型会出问题?!
本文出自"Python为什么"系列,请查看全部文章 不久前,Python猫 给大家推荐了一本书<流畅的Python>(点击可跳转阅读),那篇文章有比较多的"溢 ...
- Python——内置类型
Python定义了丰富的数据类型,包括: 数值型:int, float, complex 序列:(iterable) str, unicode, tuple, list, bytearray, buf ...
- 易被忽略的Python内置类型
Python中的内置类型是我们开发中最常见的,很多人都能熟练的使用它们. 然而有一些内置类型确实不那么常见的,或者说往往会被我们忽略,所以这次的主题就是带领大家重新认识这些"不同寻常&quo ...
- 3、python内置类型(0529)
python的内置对象类型以及支持的运算 python对象的相关术语 python程序中保存的所有数据都是围绕对象这个概念展开的 程序中存储的所有数据都是对象 每个对象都有一个身份.一个类型和一个值 ...
- python内置类型详细解释
文章编写借鉴于内置类型 - Python 3.7.3 文档,主要用于自己学习和记录 python主要内置类型包括数字.序列.映射.类.实例和异常 有些多项集类是可变的.它们用于添加.移除或重排其成员的 ...
- Python内置类型(4)--数值
Python有以下三种的数值类型: 整型(integers), 浮点型(floating point numbers), 以及 复数(complex numbers).此外,布尔是整数的子类型. 数值 ...
- Python内置类型——list
list(列表)是Python内置的可变序列(Sequence)类型,list的对象的方法也都是就地(in-place)更改调用这些方法的列表对象, List的一些细节 可以直接为list的某个下标赋 ...
随机推荐
- Codeforces.600E.Lomsat gelral(dsu on tree)
题目链接 dsu on tree详见这. \(Description\) 给定一棵树.求以每个点为根的子树中,出现次数最多的颜色的和. \(Solution\) dsu on tree模板题. 用\( ...
- Python图形编程探索系列-07-程序登录界面设计
设计任务 初步设计程序登录界面,详细分析设计步骤. 程序详细分析 基本框架设计 import tkinter as tk import tkinter.messagebox root = tk.Tk( ...
- 创建django出现的问题
1.创建表报错 2.静态文件和模板配置 3.在表格插入数据库信息 4.继承模板 5.找不到post请求数据
- 【转载】实用VC++6.0插件
[转自]http://www.cnblogs.com/witxjp/archive/2011/04/03/2004556.html Visual Assist(强烈推荐)网址:http://www.w ...
- World final 2017 题解
链接:https://pan.baidu.com/s/1kVQc9d9 Problem A: #include <cstdio> #include <algorithm> #i ...
- 使用 IntraWeb (32) - Url 映射与 THandlers
最简单的 Url 映射是使用 TIWAppForm 的 class 方法: SetURL; THandlers 是 IntraWeb XIV 新增的内容处理器, 它能完成的不仅仅是 Url 映射(转发 ...
- 各种Oracle索引类型介绍
逻辑上:Single column 单行索引Concatenated 多行索引Unique 唯一索引NonUnique 非唯一索引Function-based函数索引Domain 域索引 物理上:Pa ...
- 编码原则:最小化使用控制结构(条件和循环)续:告别 break 和 continue
如果最小化的使用了for.while等控制结构,那么,之前控制结构对应的两个控制语句(break he continue)也需要有对应的替换方案,好在几乎所有支持高阶函数的语言的集合API都有支持.
- iOS:百度长语音识别具体的封装:识别、播放、进度刷新
一.介绍 以前做过讯飞语音识别,比较简单,识别率很不错,但是它的识别时间是有限制的,最多60秒.可是有的时候我们需要更长的识别时间,例如朗诵古诗等功能.当然讯飞语音也是可以通过曲线救国来实现,就是每达 ...
- Socket编程的UDP与TCP,应用在哪些地方
随着网络技术飞速发展,网速已不再是传输的瓶颈,UDP协议以其简单.传输快的优势,在越来越多场景下取代了TCP,如网页浏览.流媒体.实时游戏.物联网. 1,网速的提升给UDP稳定性提供可靠网络保障 CD ...