set(集合)

本文详细介绍了Python中的集合(set)及其不可变版本frozenset,包括集合的定义、创建方法、基本操作如添加、删除和查找,以及集合之间的运算如子集、并集、交集和差集。
摘要由CSDN通过智能技术生成

Python实用教程_spiritx的博客-CSDN博客

集合(set)是一个无序的不重复元素序列。

和数学中的集合概念一样,用来保存不重复的元素,即集合中的元素都是唯一的,互不相同。

集合的定义

可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

创建格式:

parame = {value01,value02,...}
或者
set(value)

从内容上看,集合中,只能存储不可变的数据类型,包括整形、浮点型、字符串、元组,无法存储列表、字典、集合这些可变的数据类型,否则 Python 解释器会抛出 TypeError 错误。比如说:

>>> {{'a':1}}
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    {{'a':1}}
TypeError: unhashable type: 'dict'
>>> {[1,2,3]}
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    {[1,2,3]}
TypeError: unhashable type: 'list'
>>> {{1,2,3}}
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    {{1,2,3}}
TypeError: unhashable type: 'set'

并且需要注意的是,数据必须保证是唯一的,因为集合对于每种数据元素,只会保留一份。例如:

>>> {1,2,1,(1,2,3),'c','c'}
{1, 2, 'c', (1, 2, 3)}

由于 Python 中的 set 集合是无序的,所以每次输出时元素的排序顺序可能都不相同。

Python 提供了 2 种创建 set 集合的方法,分别是使用 {} 创建和使用 set() 函数将列表、元组等类型数据转换为集合。

使用 {} 创建

在 Python 中,创建 set 集合可以像列表、元素和字典一样,直接将集合赋值给变量,从而实现创建集合的目的,其语法格式如下:

setname = {value01,value02,...}

其中,setname 表示集合的名称,value01、value02......,是集合的元素。

a = {1,'c',1,(1,2,3),'c'}
print(a) #{1, 'c', (1, 2, 3)}

set()函数创建集合

set() 函数为 Python 的内置函数,其功能是将字符串、列表、元组、range 对象等可迭代对象转换成集合。该函数的语法格式如下:

setname = set(iteration)

其中,iteration 就表示字符串、列表、元组、range 对象等数据。

set1 = set("python")
set2 = set([1,2,3,4,5])
set3 = set((1,2,3,4,5))
print("set1:",set1)
print("set2:",set2)
print("set3:",set3)

‘’'
set1: {'o', 't', 'h', 'p', 'n', 'y'}
set2: {1, 2, 3, 4, 5}
set3: {1, 2, 3, 4, 5}
‘''

注意,如果要创建空集合,只能使用 set() 函数实现。因为直接使用一对 {},Python 解释器会将其视为一个空字典。

集合的基本操作

访问集合元素

由于集合中的元素是无序的,因此无法向列表那样使用下标访问元素。Python 中,访问集合元素最常用的方法是使用循环结构,将集合中的数据逐一读取出来。

a = {1,'c',1,(1,2,3),'c'}
for ele in a:
    print(ele,end=' ‘)

’’’
1 c (1, 2, 3)
‘’‘

删除集合

和其他序列类型一样,手动函数集合类型,也可以使用 del() 语句,例如:

a = {1,'c',1,(1,2,3),'c'}
print(a)
del(a)
print(a)

’’’
{1, 'c', (1, 2, 3)}
Traceback (most recent call last):
  ...
    print(a)
NameError: name 'a' is not defined
‘''

增加元素

语法格式如下:

set.add(x)

将元素 x 添加到集合 set 中,如果元素已存在,则不进行任何操作。

>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.add("Facebook")
>>> print(thisset)
{'Taobao', 'Facebook', 'Google', 'Runoob'}

还有一个方法,也可以添加元素,且参数可以是列表,元组,字典等,语法格式如下:

set.update(x)

x 可以有多个,用逗号分开。

>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.update({1,3})
>>> print(thisset)
{1, 3, 'Google', 'Taobao', 'Runoob'}
>>> thisset.update([1,4],[5,6])  
>>> print(thisset)
{1, 3, 4, 5, 6, 'Google', 'Taobao', 'Runoob'}
>>>

移除元素

语法格式如下:

set.remove(x)

 将元素 x 从集合 set 中移除,如果元素不存在,则会发生错误。

>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.remove("Taobao")
>>> print(thisset)
{'Google', 'Runoob'}
>>> thisset.remove("Facebook")   # 不存在会发生错误
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Facebook'
>>>

此外还有一个方法也是移除集合中的元素,且如果元素不存在,不会发生错误。格式如下所示:

set.discard(x)

>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.discard("Facebook")  # 不存在不会发生错误
>>> print(thisset)
{'Taobao', 'Google', 'Runoob'}

也可以设置随机删除集合中的一个元素,语法格式如下:

set.pop(x)

thisset = set(("Google", "Runoob", "Taobao", "Facebook"))
x = thisset.pop()

print(x)
print(thisset)

‘’'
Facebook
{'Taobao', 'Google', 'Runoob’}
‘''

多次执行测试结果都不一样。

set 集合的 pop 方法会对集合进行无序的排列,然后将这个无序排列集合的左面第一个元素进行删除。如果集合为空,会引发 KeyError)

计算集合元素的个数

语法格式如下:

len(set)

计算集合 set 元素个数。

>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> len(thisset)
3

清空集合

语法格式如下:

set.clear()

清空集合 set。

>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.clear()
>>> print(thisset)
set()

判断元素是否在集合中存在

语法格式如下:

x in set

判断元素 x 是否在集合 set 中,存在返回 True,不存在返回 False。

>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> "Runoob" in thisset
True
>>> "Facebook" in thisset
False
>>>

拷贝集合

copy 返回集合的浅拷贝。

>>> s = {1, 2, 3, 4, 5, 6}
>>> new_s = s.copy()
>>> new_s
{1, 2, 3, 4, 5, 6}

集合运算

子集

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

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

>>> A = set('abcd')
>>> B = set('cdef')
>>> C = set("ab")
>>> C < A
True         # C 是 A 的子集
>>> C < B
False
>>> C.issubset(A)
True        

并集

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

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

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

交集

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

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

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

也可以计算多个集合的交集: 

x = {"a", "b", "c"}
y = {"c", "d", "e"}
z = {"f", "g", "c"}
x.intersection_update(y, z)
print(x)
输出结果为:
{'c'}

差集

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

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

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

对称差

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

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

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

集合内置方法列表

方法

描述

add()

为集合添加元素

clear()

移除集合中的所有元素

copy()

拷贝一个集合

difference()

返回多个集合的差集

difference_update()

移除集合中的元素,该元素在指定的集合也存在。

discard()

删除集合中指定的元素

intersection()

返回集合的交集

intersection_update()

返回集合的交集。

isdisjoint()

判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False

issubset()

判断指定集合是否为该方法参数集合的子集。

issuperset()

判断该方法的参数集合是否为指定集合的子集

pop()

随机移除元素

remove()

移除指定元素

symmetric_difference()

返回两个集合中不重复的元素集合。

symmetric_difference_update()

移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中。

union()

返回两个集合的并集

update()

给集合添加元素

另外一些python内置函数也可以使用在集合上:

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

不可变集合frozenset

内置函数 frozenset([iterable]) 可构建不可变集合,称为冻结集合,返回一个新的 frozenset 对象,它包含可选参数 iterable 中的元素。 frozenset 是一个内置的类。

语法为 class frozenset([iterable]),其中参数 iterable 是可选的,不传入时会创建一个空的冻结集合,传入时由 iterable 中的元素初始化。

参数

参数 iterable 是一个可迭代对象(比如列表、字典、元组、字符串等),将此对象转为一个冻结集合。如果不传则为一个空的冻结集合。

特性

冻结集合只是 Python 集合(set)对象的一个不可变版本。set 可以随时修改集合的元素,但冻结集合的元素在创建后保持不变。因此,冻结集可以用作字典中的键或另一个集合的元素。和集合一样,它不是有序的(元素不可以索引)。

作用

为什么需要冻结的集合(即不可变的集合)呢?因为在集合的关系中,有集合的中的元素是另一个集合的情况,但是普通集合(set)本身是可变的,那么它的实例就不能放在另一个集合中(set中的元素必须是不可变类型)。

所以,frozenset提供了不可变的集合的功能,当集合不可变时,它就满足了作为集合中的元素的要求,就可以放在另一个集合中了。

操作

冻结集合为一个不可变、无序对象,不对对其进行增加、修改、排序、下标切取等操作,但它也具有集合的一些特性,可以操作交差并补等集合的操作。

fs = frozenset([1,2,3])
fs
# frozenset({1, 2, 3})

fs.intersection([2,3,4]) # 交
# frozenset({2, 3})

fs.symmetric_difference([1,2]) # 差集(对称差)
# frozenset({3})

fs.union([2,3,4]) # 并
# frozenset({1, 2, 3, 4})

fs.isdisjoint([2,3,4]) # 是否空交集为空
# False

fs.issubset([1,2,3,4]) # 是否子集
# True

fs.issuperset([1,2]) # 是否超集
# True

# 浅拷贝
fs.copy() is fs
# True

由于它是一个容器类型,因此也支持取长度、最大值、返回重排序列等操作,可参考 集合 set。 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值