Python----源码安装Python语言(CentOS7系统)(centos7 python3安装)
411
2022-08-23
Python 集合(python基础教程)
简述
数学上有一个基础概念 -集合,上高一的时候学过。集合的作用大吗?高考必考,你说呢?
关于集合,维基百科这样描述:
集合是基本的数学概念,它是集合论的研究对象,指具有某种特定性质的事物的总体,(在最原始的集合论─朴素集合论─中的定义,集合就是“一堆东西”。)集合里的事物(“东西”),叫作元素。若然 x 是集合 A 的元素,记作 x ∈ A。
在 Python 中,集合分为两类:
set:可变集合frozenset:不可变集合
set 可以原地修改,或者说是可变的,也可以说是 unhashable(不可哈希)的。
frozenset,顾名思义,是一个被“冻结”的集合,不能原地修改,是 hashable(可哈希)的。
集合
在 Python 中,集合由内置的 set 类型定义。
要创建集合,需要将所有项(元素)放在花括号({})内,以逗号(,)分隔。
>>> s = {'P', 'y', 't', 'h', 'o', 'n'}>>> type(s)
集合可以有任意数量的元素,它们可以是不同的类型(例如:数字、元组、字符串等)。但是,集合不能有可变元素(例如:列表、集合或字典)。
>>> 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)
集合的特性
子曰:“温故而知新,可以为师矣。” –《论语》
回顾数学相关知识,集合有以下特性:
无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的。集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序。但就集合本身的特性而言,元素之间没有必然的序。互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。有时需要对同一元素出现多次的情形进行刻画,可以使用多重集,其中的元素允许出现多次。确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现。
当然,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 sTrue>>> >>> 'P' not in sTrue
注意: 由于集合是无序的,所以索引没有任何意义。也就是说,无法使用索引或切片访问或更改集合元素。
集合运算
集合之间也可进行数学集合运算(例如:并集、交集等),可用相应的操作符或方法来实现。
考虑 A、B 两个集合,进行以下操作。
>>> A = set('abcd')>>> B = set('cdef')
子集
子集,为某个集合中一部分的集合,故亦称部分集合。
使用操作符 < 执行子集操作,同样地,也可使用方法 issubset() 完成。
>>> C = set('ab')>>> >>> C < ATrue>>> >>> C < BFalse>>> >>> 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() # 清空集合>>> sset()
注意: 集合是无序的,所以无法确定哪个元素将被 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)
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 是不可变的,所以没有添加或删除元素的方法。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~