python sets — Unordered collections of unique elements

python sets — 独有元素的无序集合

本文内容部分来自官方文档

Python set是基本数据类型的一种集合类型,它有可变集合(set())和不可变集合(frozenset)两种。

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

In [183]: frozen = frozenset('halo the world, hi!')

In [184]: frozen
Out[184]: frozenset({' ', '!', ',', 'a', 'd', 'e', 'h', 'i', 'l', 'o', 'r', 't', 'w'})

In [185]: froz
frozen     frozenset  

In [185]: frozen.add('halo')
#######向不可变集合(frozenset)添加元素报错!!!
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-185-f280cad482cf> in <module>()
----> 1 frozen.add('halo')

AttributeError: 'frozenset' object has no attribute 'add'
######!!!不可变集合没有添加元素的属性
In [186]: 

sets模块提供了构造和处理独有元素的无序集合的类. 常用来进行成员测试、序列元素去重、计算标准的数学运算(交集、并集、差集、交差)

类似其他集合,sets支持x in set, len(set), 以及 for x in set语法.作为无序集合,sets不记录元素的位置或者插入顺序 相应的,sets不支持索引、切片和其他的序列类似行为 。既然是可变的,所以它不存在哈希值。

大多数的集合应用使用Set类来提供除了hash()的集合方法.对于需要哈希方法的高级应用,ImmutableSet类添加了一个hash()方法,但是却省略了改变集合内容的方法。Set和ImmutableSet都来自BaseSet(一个抽象类用来判定集合 an isinstance(obj, BaseSet).
set的常用操作如下(方法的含义看单词就知道了就不作翻译了):

In [180]: setInstance=set(['ele1','ele2','ele3'])

In [181]: setInstance.
setInstance.add                          setInstance.intersection                 setInstance.remove
setInstance.clear                        setInstance.intersection_update          setInstance.symmetric_difference
setInstance.copy                         setInstance.isdisjoint                   setInstance.symmetric_difference_update
setInstance.difference                   setInstance.issubset                     setInstance.union
setInstance.difference_update            setInstance.issuperset                   setInstance.update
setInstance.discard                      setInstance.pop                          

In [181]: setInstance.

混合集合类型操作

>>> 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,或相反情况),则所产生的结果类型与左操作数的类型相同。

集合类使用字典来执行,所以,集合元素的要求和字典元素的键的要求一样。也就是说元素拥有 eq() 和 hash()方法。 因此集合不能包含可变元素,但是可以包含不可变的数据类型如元组或者ImmutableSet的实例. 为了方便执行集合的嵌套,内层集合自动会转换为immutable形式,例如:

Set([Set(['dog'])]) 会转化成 Set([ImmutableSet(['dog'])]).

Set和ImmutableSet的实例都提供以下的操作:
这里写图片描述

以下操作只存在于 Set 而不存在于 ImmutableSet:
这里写图片描述

示例

>>> from sets import Set
>>> engineers = Set(['John', 'Jane', 'Jack', 'Janice'])
>>> programmers = Set(['Jack', 'Sam', 'Susan', 'Janice'])
>>> managers = Set(['Jane', 'Jack', 'Susan', 'Zack'])
>>> employees = engineers | programmers | managers         # 并集
>>> engineering_management = engineers & managers          # 交集
>>> fulltime_management = managers - engineers - programmers # 差集
>>> engineers.add('Marvin')                                  # 添加元素
>>> print engineers 
Set(['Jane', 'Marvin', 'Janice', 'John', 'Jack'])
>>> employees.issuperset(engineers)     #  超集测试
False
>>> employees.update(engineers)         # 从另外的集合中进行更新
>>> employees.issuperset(engineers)
True
>>> for group in [engineers, programmers, managers, employees]: 
...     group.discard('Susan')          # 无条件删除元素
...     print group
...
Set(['Jane', 'Marvin', 'Janice', 'John', 'Jack'])
Set(['Janice', 'Jack', 'Sam'])
Set(['Jane', 'Zack', 'Jack'])
Set(['Jack', 'Sam', 'Jane', 'Marvin', 'Janice', 'John', 'Zack'])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值