python 集合set

在 Python 中,集合分为两类:
set:可变集合,是不重复的数据结构
frozenset:不可变集合
set 可以原地修改,或者说是可变的,也可以说是 unhashable(不可哈希)的。
frozenset,顾名思义,是一个被“冻结”的集合,不能原地修改,是 hashable(可哈希)的

集合的两个功能:
集合可以实现去重的功能;
集合可以实现关系测试; 交集, 差集,并集, 是否子集, 是否没有交集…
集合的创建

在 Python 中,集合由内置的 set 类定义。创建集合的两种方法:
1 使用{}创建,以逗号分隔。
2 set() -> new empty set object
set(iterable) -> new set object

>> s = {'p', 'y', 't', 'h', 'o', 'n'}
>> type(s)
<class 'set'>
>>set()  #创建空集合,{}是空字典。
set() 
>>set((1,'python',2))
{1, 2, 'python'}

集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型,例如:数字、元组、字符串等,),所以集合不能有可变类型(例如:列表、集合或字典)但是集合本身是不可哈希(所以集合做不了字典的键)的

>> s = {1, 2, 3}  # 同类型的集合
>> 
>> s = {1.0, 'Python', (1, 2, 3)}  # 混合类型的集合
>>
>> s = {1, 2, [3, 4]}  # 不能有可变类型元素
...
TypeError: unhashable type: 'list'

集合的特性

1 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的。
集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序。但就集合本身的特性而言,元素之间没有必然的序。
2 互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。
有时需要对同一元素出现多次的情形进行刻画,可以使用多重集,其中的元素允许出现多次。
3 确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现。

# 无序性
>> a = set('Python')
>> a
{'y', 'n', 'h', 'o', 'P', 't'}
#互异性
>> s = set('Hellllo')
>> s
{'e', 'H', 'l', 'o'}
# 确定性
>> 'l' in s
True
>> 'P' not in s
True

交集 (& 或者 intersection)

两个集合 A 和 B 的交集是含有所有既属于 A 又属于 B 的元素

set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
>>set1 & set2  
>>set1.intersection(set2)
{4, 5}

并集(| 或者 union)

一组集合的并集是这些集合的所有元素构成的集合

set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
>>set1 | set2 
>>set2.union(set1) 
{1, 2, 3, 4, 5, 6, 7}

差集(- 或者 difference)

A 与 B 的差集是所有属于 A 且不属于 B 的元素构成的集合

set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
>>set1 - set2
>>set1.difference(set2)
 {1, 2, 3}

反交集 (^ 或者 symmetric_difference)

set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
>>set1 ^ set2
>>set1.symmetric_difference(set2)
{1, 2, 3, 6, 7, 8}

子集 (< 或者 issubset)##

set1 = {1,2,3}
set2 = {1,2,3,4,5,6}
>>set1 < set2
>>set1.issubset(set2)
True                   # 说明set1是的set2子集。

超集 (>或者issuperset)

set1 = {1,2,3}
set2 = {1,2,3,4,5,6}
>>set2 > set1
>>set2.issuperset(set1)
True                 #说明set2是的set1超集

更改集合

虽然集合不能有可变元素,但是集合本身是可变的。也就是说,可以添加或删除其中的元素。
可以使用 add() 方法添加单个元素,使用 update() 方法添加多个元素,update() 可以使用元组、列表、字符串或其他集合作为参数。

>> s = {'P', 'y'}
>> s.add('t')  # 添加一个元素
>> s
{'P', 'y', 't'}
>> 
>> s.update(['h', 'o', 'n'])  # 添加多个元素
>> s
{'y', 'o', 'n', 't', 'P', 'h'}
>> s.update(['H', 'e'], {'l', 'l', 'o'})  # 添加列表和集合
>> s
{'H', 'y', 'e', 'o', 'n', 't', 'l', 'P', 'h'}

从集合中删除元素

可以使用 discard() 和 remove() 方法删除集合中特定的元素。
两者之间唯一的区别在于:如果集合中不存在指定的元素,使用 discard() 保持不变;但在这种情况下,remove() 会引发 KeyError。

>> s = {'P', 'y', 't', 'h', 'o', 'n'}
>> 
>> s.discard('t')  # 去掉一个存在的元素
>> s
{'y', 'o', 'n', 'P', 'h'}
>> 
>> s.remove('h')  # 删除一个存在的元素
>> s
{'y', 'o', 'n', 'P'}

>> s.discard('w')  # 去掉一个不存在的元素(正常)
>> s
{'y', 'o', 'n', 'P'}
>> s.remove('w')  # 删除一个不存在的元素(引发错误)
...
KeyError: 'w'

类似地,可以使用 pop() 方法删除和返回一个项目。
还可以使用 clear() 删除集合中的所有元素。

>>> s = set('Python')
>>> 
>>> s.pop()  # 随机返回一个元素
'y'
>>> 
>>> s.clear()  # 清空集合
>>> s
set()

注意: 集合是无序的,所以无法确定哪个元素将被 pop,完全随机

集合的方法

利用 dir() 来查看方法列表:

>>dir(set)
['__and__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__dir__',
 '__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__',
 'add',
 'clear',
 'copy',
 'difference',
 'difference_update',
 'discard',
 'intersection',
 'intersection_update',
 'isdisjoint',
 'issubset',
 'issuperset',
 'pop',
 'remove',
 'symmetric_difference',
 'symmetric_difference_update',
 'union',
 'update']
方法描述
add()将元素添加到集合中
clear()删除集合中的所有元素
copy()返回集合的浅拷贝
difference()将两个或多个集合的差集作为一个新集合返回
difference_update()从这个集合中删除另一个集合的所有元素
discard()删除集合中的一个元素(如果元素不存在,则不执行任何操作)
intersection()将两个集合的交集作为一个新集合返回
intersection_update()用自己和另一个的交集来更新这个集合
isdisjoint()如果两个集合有一个空交集,返回 True
issubset()如果另一个集合包含这个集合,返回 True
issuperset()如果这个集合包含另一个集合,返回 True
pop()删除并返回任意的集合元素(如果集合为空,会引发 KeyError)
remove()删除集合中的一个元素(如果元素不存在,会引发 KeyError)
symmetric_difference()将两个集合的对称差作为一个新集合返回
symmetric_difference_update()用自己和另一个的对称差来更新这个集合
union()将集合的并集作为一个新集合返回
update()用自己和另一个的并集来更新这个集合

集合与内置函数

下述内置函数通常作用于集合,来执行不同的任务。

方法描述
all()如果集合中的所有元素都是 True(或者集合为空),则返回 True。
any()如果集合中的所有元素都是 True,则返回 True;如果集合为空,则返回 False。
enumerate()返回一个枚举对象,其中包含了集合中所有元素的索引和值(配对)
len()返回集合的长度(元素个数)
max()返回集合中的最大项
min()返回集合中的最小项
sorted()从集合中的元素返回新的排序列表(不排序集合本身)
sum()返回集合的所有元素之和

不可变集合

frozenset 是一个具有集合特征的新类,但是一旦分配,它里面的元素就不能更改。这一点和元组非常类似:元组是不可变的列表,frozenset 是不可变的集合。
集合是 unhashable 的,因此不能用作字典的 key;而 frozensets 是 hashable 的,可以用作字典的 key。
可以使用函数 frozenset() 创建 frozenset。

>>> s = frozenset('Python')
>>> type(s)
<class 'frozenset'>

frozenset 也提供了一些列方法,和 set 中的类似。

>> dir(frozenset)

由于 frozenset 是不可变的,所以没有添加或删除元素的方法

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值