python内置对象类型(五)序列之set集合

集合的相关定义

Python 中的集合和数学中的集合概念一样(无序性、不重复性),用来保存不重复的元素,即集合中的元素都是唯一的、互不相同的、但是不要求集合中的元素类型都一样,从形式上看,和字典类似,Python 集合会将所有元素放在一对大括号 {} 中相邻元素之间用“,”分隔,从内容上看,同一集合中,只能存储不可变的数据类型,包括整形、浮点型、布尔型、字符串、元组,无法存储列表、字典、集合这些可变的数据类型,否则 Python 解释器会抛出 TypeError 错误 ,但是可以把列表 集合这些可变对象的元素通过set()frozenset()方法转成集合,不是可变对象本身

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

在这里插入图片描述
在这里插入图片描述
Python 中有两种集合类型,一种是 set 类型的集合,另一种是 frozenset 类型的集合,它们唯一的区别是,set 类型集合可以做添加、删除元素的操作,而 forzenset 类型集合不行

一、set集合(可变集合)

1、创建

方法一、直接使用 {} 元素赋值

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

运行结果
{1, 'c', (1, 2, 3)}

方法二、使用内置函数set() 将字符串、列表、元组、range 等可迭代对象(的元素)转换成集合
该方法的参数只能是上述可迭代对象,不能直接是元素 需要现将元素封装成可迭代对象
在这里插入图片描述

set1 = set("c.biancheng.net")
set2 = set([1,2,3,4,5])
tpl=(1,2,3,4,5)
set3 = set(tpl)
print("set1:",set1)
print("set2:",set2)
print("set3:",set3)

运行结果
set1: {'a', 'g', 'b', 'c', 'n', 'h', '.', 't', 'i', 'e'}
set2: {1, 2, 3, 4, 5}
set3: {1, 2, 3, 4, 5}

两种方法都会自动去重复
若要创建空集合只能使用 set() 函数,因为直接使用一对 {}Python 解释器会将其视为一个空字典。
在这里插入图片描述

2、set基本操作(添加、删除、交、并、差)

setname.add(element) :使用 add() 方法添加的元素,只能是数字、字符串、元组或者布尔类型(True 和 False)值,不能添加列表、字典、集合这类可变的数据,否则 Python 解释器会报 TypeError 错误

setname.remove(element) :如果被删除元素本就不包含在集合中,则此方法会抛出 KeyError 错误

在这里插入图片描述

3、set常用方法

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
注意:
operate()operate_update()的区别:调用集合set1覆盖与否
update() add()的区别 :添加可变与否
discard(elem) remove(elem) 和 pop()的区别 :elem不存在报错与否
copy()浅拷贝:表层深拷贝,其余浅拷贝
在这里插入图片描述

4、set集合元素的访问

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

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

二、frozenset集合 (不可变集合)

set 集合是可变序列,程序可以改变序列中的元素;
frozenset 集合是不可变序列,程序不能改变序列中的元素。
set 集合中所有能改变集合本身的方法,比如 remove()、discard()、add() 等frozenset 都不支持;
set 集合中不改变集合本身的方法,fronzenset 都支持。

>>> dir(frozenset)
['copy', 'difference', 'intersection', 'isdisjoint', 
'issubset', 'issuperset', 'symmetric_difference', 'union']

两种情况下可以使用 fronzenset:
当集合的元素不需要改变时,我们可以使用 fronzenset 替代 set,这样更加安全。
程序要求必须是不可变对象,这个时候也要使用 fronzenset 替代 set。比如,字典(dict)的键(key)就要求是不可变对象。

s = {'Python', 'C', 'C++'}
fs = frozenset(['Java', 'Shell'])  将列表转成不可变集合
s_sub = {'PHP', 'C#'}

#向set集合中添加frozenset   允许
s.add(fs)
print('s =', s)

#向为set集合添加子set集合   保错
s.add(s_sub)
print('s =', s)

运行结果
s = {'Python', frozenset({'Java', 'Shell'}), 'C', 'C++'}
Traceback (most recent call last):
    File "C:\Users\mozhiyan\Desktop\demo.py", line 11, in <module>
        s.add(s_sub)
TypeError: unhashable type: 'set'

需要注意的是,set 集合本身的元素必须是不可变的, 所以 set 的元素不能是 set,只能是 frozenset。 所以向 set 中添加 frozenset 是没问题的,因为 frozenset 是不可变的;但是,尝试向 set 中添加子 set,这是不允许的,因为 set 是可变的

>>> s
{'python', 1, (1, 2, 3)}
>>> fs= frozenset({'Java', 'Shell'})
>>> fs
frozenset({'Shell', 'Java'})
>>> fs1=frozenset('python')
>>> fs1
frozenset({'n', 'p', 'o', 't', 'y', 'h'})  是将字符串的元素:各个字符转成fs1的元素
>>> fs2=frozenset([1,'python'])   是将列表的元素:1 和‘python’
>>> fs2
frozenset({1, 'python'})`
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值