python 集合

定义:由不同元素组成的集合,集合中是一组无序排列的可hash值,可以作为字典的key

特性:集合的目的是将不同的值存放到一起,不同的集合间用来做关系运算,无需纠结集合中的单个值。在Python中集合set基本数据类型的一种,它有可变集合(set)和不可变集合(frozenset)两种。创建集合set集合set添加集合删除交集并集差集的操作都是非常实用的方法

补充:

不可变类型:字符串,数字,元祖

可变类型:列表,字典

不同元素组成,无序的,集合中的元素必须是不可变类型,set集合是无序的,不能通过索引和切片来做一些操作

1.创建集合

set类是在python的sets模块中,大家现在使用的python2.3中,不需要导入sets模块可以直接创建集合。

>> > set('boy')
    set(['y', 'b', 'o'])

在 Python 中,集合由内置的 set 类型定义。要创建集合,需要将所有项(元素)放在花括号({})内,以逗号(,)分隔。

>>> s = {'P', 'y', 't', 'h', 'o', 'n'}
>>> type(s)
<class 'set'>

集合可以有任意数量的元素,它们可以是不同的类型(例如:数字、元组、字符串等)。但是,集合不能有可变元素(例如:列表、集合或字典)。

>>> s = {1, 2, 3}  # 整形的集合
>>> 
>>> s = {1.0, 'Python', (1, 2, 3)}  # 混合类型的集合
>>> 
>>> s = set(['P', 'y'])  # 从列表创建
>>>
>>> s = {1, 2, [3, 4]}  # 不能有可变元素
...
TypeError: unhashable type: 'list'

创建空集合比较特殊。在 Python 中,空花括号({})用于创建空字典。要创建一个没有任何元素的集合,使用 set() 函数(不要包含任何参数)。

>>> d = {}  # 空字典
>>> type(d)
<class 'dict'>
>>> 
>>> s = set()  # 空集合
>>> type(s)
<class 'set'>

2.集合添加、删除

集合的添加有两种常用方法,分别是add和update。
集合add方法:是把要传入的元素做为一个整个添加到集合中,例如:
>>> a = set('boy')
>>> a.add('python')
>>> a
set(['y', 'python', 'b', 'o'])
集合update方法:是把要传入的元素拆分,做为个体传入到集合中,例如:
>>> a = set('boy')
>>> a.update('python')
>>> a
set(['b', 'h', 'o', 'n', 'p', 't', 'y'])
集合删除操作方法:remove
set(['y', 'python', 'b', 'o'])
>>> a.remove('python')
>>> a
set(['y', 'b', 'o'])

3.SET集合的遍历

#遍历Set:
def iterSet():
    s = set([1 ,2 ,3])
    for item in s:
        print(item)
# 结果:1
       2
       3
    for i in enumerate(s):
        print (i)
# 结果:(0, 1)
       (1, 2)
       (2, 3)
4.python集合操作符号、数学符号
集合的交集、合集(并集)、差集,了解集合set的这些非常好用的功能前,要先了解一些集合操作符号
数字符号Python符号含义
-或\-差集,相对补集
&交集
|合集,并集
!=不等于
===等于
in是成员关系
not in不是成员关系
考虑 A、B 两个集合,进行以下操作。
>>> A = set('abcd')
>>> B = set('cdef')

子集

子集,为某个集合中一部分的集合,故亦称部分集合。

使用操作符 < 执行子集操作,同样地,也可使用方法 issubset() 完成。

>>> C = set('ab')
>>> 
>>> C < A
True
>>> 
>>> C < B
False
>>> 
>>> C.issubset(A)
True

并集

一组集合的并集是这些集合的所有元素构成的集合,而不包含其他元素。

使用操作符 | 执行并集操作,同样地,也可使用方法 union() 完成。

>>> A | B
{'e', 'f', 'd', 'c', 'b', 'a'}
>>> 
>>> A.union(B)
{'e', 'f', 'd', 'c', 'b', 'a'}

交集

两个集合 A 和 B 的交集是含有所有既属于 A 又属于 B 的元素,而没有其他元素的集合。

使用 & 操作符执行交集操作,同样地,也可使用方法 intersection() 完成。

>>> A & B
{'d', 'c'}
>>> 
>>> A.intersection(B)
{'d', 'c'}

差集

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

使用操作符 - 执行差集操作,同样地,也可使用方法 difference() 完成。

>>> A - B
{'b', 'a'}
>>> 
>>> A.difference(B)
{'b', 'a'}

对称差

两个集合的对称差是只属于其中一个集合,而不属于另一个集合的元素组成的集合。

使用 ^ 操作符执行差集操作,同样地,也可使用方法 symmetric_difference() 完成。

>>> A ^ B
{'b', 'e', 'f', 'a'}
>>> 
>>> A.symmetric_difference(B)
{'b', 'e', 'f', 'a'}

更改集合

虽然集合不能有可变元素,但是集合本身是可变的。也就是说,可以添加或删除其中的元素。

可以使用 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()用自己和另一个的并集来更新这个集合

其中一些方法在上述示例中已经被使用过了,如果有方法不会用,可利用 help() 函数,查看用途及详细说明。

集合与内置函数

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

函数描述
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)
['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__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__', 'copy', 'difference', 'intersection', 'isdisjoint', 'issubset', 'issuperset', 'symmetric_difference', 'union']

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

 

集合的特性

回顾数学相关知识,集合有以下特性:

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

当然,Python 中的集合也具备这些特性:

# 无序性
>>> s = set('Python')
>>> s
{'y', 'n', 'h', 'o', 'P', 't'}
>>>
>>> s[0]  # 不支持索引
...
TypeError: 'set' object does not support indexing

# 互异性
>>> s = set('Hello')
>>> s
{'e', 'H', 'l', 'o'}

# 确定性
>>> 'l' in s
True
>>> 
>>> 'P' not in s
True

注意: 由于集合是无序的,所以索引没有任何意义。也就是说,无法使用索引或切片访问或更改集合元素。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值