Python中set与frozenset方法和区别详解

set(可变集合)与frozenset(不可变集合)的区别:

set无序排序且不重复,是可变的,有add(),remove()等方法。既然是可变的,所以它不存在哈希值。基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交集), difference(差集)和sysmmetric difference(对称差集)等数学运算.

sets 支持 x in set, len(set),和 for x in set。作为一个无序的集合,sets不记录元素位置或者插入点。因此,sets不支持 indexing, 或其它类序列的操作。

frozenset是冻结的集合,它是不可变的,存在哈希值,好处是它可以作为字典的key,也可以作为其它集合的元素。缺点是一旦创建便不能更改,没有add,remove方法。

一、集合的创建

set()和 frozenset()工厂函数分别用来生成可变和不可变的集合。如果不提供任何参数,默认会生成空集合。如果提供一个参数,则该参数必须是可迭代的,即,一个序列,或迭代器,或支持
迭代的一个对象,例如:一个列表或一个字典。

>>> s=set('cheeseshop') 使用工厂方法创建
>>> s
{'h', 'c', 'o', 's', 'e', 'p'}
>>> type(s)
<type 'set'>
>>> s={'chessseshop','bookshop'}直接创建,类似于list的[]和dict的{},不同于dict的是其中的值,set会将其中的元素转换为元组
>>> s
{'bookshop', 'chessseshop'}
>>> type(s)
<type 'set'>

不可变集合创建:

>>> t=frozenset('bookshop')
>>> t
frozenset({'h', 'o', 's', 'b', 'p', 'k'}) 

二、更新可变集合

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

>>> s.add('z') #添加
>>> s
set(['c', 'e', 'h', 'o', 'p', 's', 'z'])
>>> s.update('pypi') #添加
>>> s
set(['c', 'e', 'i', 'h', 'o', 'p', 's', 'y', 'z'])
>>> s.remove('z') #删除
>>> s
set(['c', 'e', 'i', 'h', 'o', 'p', 's', 'y'])
>>> s -= set('pypi')#删除
>>> s
set(['c', 'e', 'h', 'o', 's'])
>>> del s #删除集合

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

>>> t.add('z')
Traceback (most recent call last):
File "<stdin>", line , in ?
AttributeError: 'frozenset' object has no attribute 'add' 

三、成员关系 (in, not in)

>>> 'k' in s
False
>>> 'k' in t
True
>>> 'c' not in t
True 

四、集合等价/不等价

>>> s == t
False
>>> s != t
True
>>> u = frozenset(s)
>>> s == u
True
>>> set('posh') == set('shop')
True 

五、子集/超集

>>> set('shop') < set('cheeseshop')
True
>>> set('bookshop') >= set('shop')
True 

六、遍历访问集合中的值(可变集合和非可变都支持)

>>> s=set('cheeseshop')
>>> s
{'h', 'c', 'o', 's', 'e', 'p'}
>>> for i in s:
print(i)
h
c
o
e
p
>>> t=frozenset('bookshop')
>>> t
frozenset({'h', 'o', 's', 'b', 'p', 'k'})
>>> for i in t:
print(i)
h
o
b
p
k 

七、集合类型操作符(所有的集合类型)

1.联合( | )

 两个集合的联合是一个新集合,该集合中的每个元素都至少是其中一个集合的成员,即,属于两个集合其中之一的成员。联合符号有一个等价的方法,union().
 >>> s | t
 set(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's']) 

2.交集( & )

 你可以把交集操作比做集合的 AND(或合取)操作。两个集合的交集是一个新集合,该集合中的每
 个元素同时是两个集合中的成员,即,属于两个集合的成员。交集符号有一个等价的方法,intersection()
 >>> s & t
 set(['h', 's', 'o', 'p']

3.差补/相对补集( – )

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

4.对称差分( ^ )

 和其他的布尔集合操作相似, 对称差分是集合的 XOR(又称"异或 ").
 两个集合(s 和 t)的对称差分是指另外一个集合 C,该集合中的元素,只能是属于集合 s 或者集合 t
 的成员,不能同时属于两个集合。对称差分有一个等价的方法,symmetric_difference().
 >>> s ^ t
 set(['k', 'b', 'e', 'c']) 

5.混合集合类型操作

 上面的示例中,左边的 s 是可变集合,而右边的 t 是一个不可变集合. 注意上面使用集合操作
 运算符所产生的仍然是可变集合,但是如果左右操作数的顺序反过来,结果就不一样了:
 >>> t | s
 frozenset(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])
 >>> t ^ s
 frozenset(['c', 'b', 'e', 'k'])
 >>> t - s frozenset(['k', 'b']) 

如果左右两个操作数的类型相同, 既都是可变集合或不可变集合, 则所产生的结果类型是相同的,但如果左右两个操作数的类型不相同(左操作数是 set,右操作数是 frozenset,或相反情况),则所产生的结果类型与左操作数的类型相同。

八、可变集合类型的方法

 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 中的元素(obj not
 in s),将引发 KeyError 错误
 s.discard(obj) 如果 obj 是集合 s 中的元素,从集合 s 中删除对象 obj;
 s.pop() 删除集合 s 中的任意一个对象,并返回它
 s.clear() 删除集合 s 中的所有元素 

九、集合类型操作符、函数和方法

函数/方法名 等价运算符 说明

所有集合类型:

 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 < t (严格意义上)子集测试; s != t 而且 s 中 所 有 的元素都是 t 的成员
 s.issubset(t) s <= t 子集测试(允许不严格意义上的子集): s 中所有的元素都是 t 的成员
 s > t (严格意义上)超集测试: s != t 而且 t 中所有的元素都是 s 的成员
 s.issuperset(t) s >= t 超集测试(允许不严格意义上的超集): t 中所有的元素 都是 s 的成员
 s.union(t) s | t 合并操作: s 或 t 中的元素
 s.intersec- tion(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中set与frozenset方法和区别详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 浅谈python中set使用

    浅谈python中set使用 In [2]: a = set() # 常用操作1 In [3]: a Out[3]: set() In [4]: type(a) Out[4]: set In [5]: b = set([1, 3]) In [6]: b Out[6]: {1, 3} In [7]: type(b) Out[7]: set In [8]: b.update(2) ------------------------------------------------------------

  • Python判断值是否在list或set中的性能对比分析

    本文实例对比分析了Python判断值是否在list或set中的执行性能.分享给大家供大家参考,具体如下: 判断值是否在set集合中的速度明显要比list快的多, 因为查找set用到了hash,时间在O(1)级别. 假设listA有100w个元素,setA=set(listA)即setA为listA转换之后的集合. 以下做个简单的对比: for i in xrange(0, 5000000): if i in listA: pass for i in xrange(0, 5000000): if

  • Python中内置数据类型list,tuple,dict,set的区别和用法

    Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个内置数据类型功不可没,他们即是list, tuple, dict, set.这里对他们进行一个简明的总结. List 字面意思就是一个集合,在Python中List中的元素用中括号[]来表示,可以这样定义一个List: L = [12, 'China', 19.998] 可以看到并不要求元素的类型都是一样的.当然也可以定义一个空的List: L = [] Python中的List是有序的,所以要访问List的话显然

  • Python中set与frozenset方法和区别详解

    set(可变集合)与frozenset(不可变集合)的区别: set无序排序且不重复,是可变的,有add(),remove()等方法.既然是可变的,所以它不存在哈希值.基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交集), difference(差集)和sysmmetric difference(对称差集)等数学运算. sets 支持 x in set, len(set),和 for x in set.作为一个无序的集合,sets不记录元素位

  • Python中__new__与__init__方法的区别详解

    在python2.x中,从object继承得来的类称为新式类(如class A(object))不从object继承得来的类称为经典类(如class A()) 新式类跟经典类的差别主要是以下几点: 1. 新式类对象可以直接通过__class__属性获取自身类型:type 2. 继承搜索的顺序发生了改变,经典类多继承时属性搜索顺序: 先深入继承树左侧,再返回,开始找右侧(即深度优先搜索);新式类多继承属性搜索顺序: 先水平搜索,然后再向上移动 例子: 经典类: 搜索顺序是(D,B,A,C) >>

  • 对python中数组的del,remove,pop区别详解

    以a=[1,2,3] 为例,似乎使用del, remove, pop一个元素2 之后 a都是为 [1,3], 如下: >>> a=[1,2,3] >>> a.remove(2) >>> a [1, 3] >>> a=[1,2,3] >>> del a[1] >>> a [1, 3] >>> a= [1,2,3] >>> a.pop(1) 2 >>>

  • 对python 中re.sub,replace(),strip()的区别详解

    1.strip(): str.strip([chars]);去除字符串前面和后面的所有设置的字符串,默认为空格 chars -- 移除字符串头尾指定的字符序列. st = " hello " st = st.strip() print(st+"end") 输出: 如果设置了字符序列的话,那么它会删除,字符串前后出现的所有序列中有的字符.但不会清除空格. st = "hello" st = st.strip('h,o,e') print(st) 因

  • Python中关键字global和nonlocal的区别详解

    前言 终于下定决心学习Python了.既然从头开始,就需要认认真真. 首先需要说的是,我是初学Python,这篇文章只是用于展示global和nonlocal关键字的区别,是很简单的知识点,如果你已经学过,可以绕道.因为不经常写博客,而且是个Python小白,所以内容有些啰嗦... 两个关键词都用于允许在一个局部作用域中使用外层的变量. global 表示将变量声明为全局变量 nonlocal 表示将变量声明为外层变量(外层函数的局部变量,而且不能是全局变量) 注意:我使用的是Python3.6

  • python中start和run方法的区别

    结论:启动线程,如果对target进行赋值,并且没有重写run方法,则线程start的时候会直接调用target中对应的方法 具体代码如下:1.初始化一个线程 threading.Thread.__init__(self,target=thread_run()) def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None): assert group is None, "g

  • 对python requests的content和text方法的区别详解

    问题: 一直在想requests的content和text属性的区别,从print 结果来看是没有任何区别的 看下源码: @property def text(self): """Content of the response, in unicode. If Response.encoding is None, encoding will be guessed using ``chardet``. The encoding of the response content is

  • 在Pytorch中计算卷积方法的区别详解(conv2d的区别)

    在二维矩阵间的运算: class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True) 对由多个特征平面组成的输入信号进行2D的卷积操作.详解 torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)

  • Python探索之静态方法和类方法的区别详解

    面相对象程序设计中,类方法和静态方法是经常用到的两个术语. 逻辑上讲:类方法是只能由类名调用:静态方法可以由类名或对象名进行调用. python staticmethod and classmethod Though classmethod and staticmethod are quite similar, there's a slight difference in usage for both entities: classmethod must have a reference to

  • 基于python cut和qcut的用法及区别详解

    我就废话不多说了,直接上代码吧: from pandas import Series,DataFrame import pandas as pd import numpy as np from numpy import nan as NA from matplotlib import pyplot as plt ages = [20,22,25,27,21,23,37,31,61,45,41,32] #将所有的ages进行分组 bins = [18,25,35,60,100] #使用pandas

随机推荐