龙空技术网

测开必会的python之集合set功能

科雷软件测试 270

前言:

目前我们对“python里面的set”大体比较关注,咱们都想要分析一些“python里面的set”的相关知识。那么小编同时在网络上收集了一些对于“python里面的set””的相关资讯,希望各位老铁们能喜欢,小伙伴们一起来学习一下吧!

文档目录

1. 集合的定义

2. 集合的无序性

3. 集合的去重

4. 集合推导式

5. 集合常用内置函数(并集/交集/差集/增加元素等)

python的集合(set)是一个无序的、不重复元素,可变的序列。

创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

集合的定义

集合使用大括号{}或者 set() 函数创建集合

setB = {'color','name'}print(type(setB))#打印结果<class 'set'>  setC = set(['color','name'])print(type(setC))#打印结果<class 'set'>
集合的无序性
#定义一个集合setB = { 'orange', 'apple', 'pear', 'banana'}print(setB)#打印结果 :元素顺序是不一致的{'pear', 'apple', 'orange', 'banana'}

集合底层采用的是哈希表结构,集合的元素都是可以使用内置函数hash()得到一个整数值

比如集合中的元素为字符串,hash值如下

print(hash('orange'))print(hash('apple'))#打印结果-2470233203673579605-2590632636591016521

但有些常用的数据类型,比如列表list、字典dict是可变的,不是可哈希的对象,是不能添加为集合元素的。

添加列表到集合会报错

setB.add([1,2,3])#报错如下Traceback (most recent call last):File "D:/test.py", line 12, in <module>setB.add([1,2,3])TypeError: unhashable type: 'list'
添加字典到集合会报错
setB.add({'key':'value'})#报错如下Traceback (most recent call last):File "D:/test.py", line 13, in <module>setB.add({'key':'value'})TypeError: unhashable type: 'dict'

但是可添加元组到集合,因为元组是不可变数据类型。

setB.add((1,23,2))print(setB)#打印结果{'apple', 'pear', 'banana', 'orange', (1, 23, 2)}
集合的去重

集合内的元素是不重复的,所以往往用于将列表、元组的去重

比如将列表A的元素去重

listA = ['orange', 'apple', 'pear', 'banana','orange']listB = set(listA)print(listB)#打印结果{'banana', 'pear', 'orange', 'apple'}

去重以后列表内的元素位置被更新,这样就与列表的有序性背道而驰。

我们可以通过有序字典collections.OrderedDict.fromkeys()功能,对列表去重并保持有序

from collections import OrderedDictlistC = list(OrderedDict.fromkeys(listA))print(listC)['orange', 'apple', 'pear', 'banana']
集合推导式

集合与列表/字典类似,也有自己的推导式,结构如下:

{表达式 for 变量 in 列表 if 条件} 其中if条件可有可无

#定义一个集合setA = {'tom','lili','joy','yhan','jams'}#通过集合推导式 从集合中获取姓名为4个字母的名字 推导式如下:setB= {name for name in setA if len(name)==4}print(f'setB 数据类型:{type(setB)} 内容:{setB}')#打印结果setB 数据类型:<class 'set'> 内容:{'yhan', 'lili', 'jams'}
集合的内置函数添加元素

set.add()和set.update()区别是set.add()只能添加单个元素,而set.update()可添加多个元素,传入的参数必须是可迭代对象,比如列表/元组/字符串等。

setA = {'tom','lili','joy','yhan','jams'}#添加单个元素setA.add('wang')#结果如下{'jams', 'joy', 'lili', 'tom', 'wang', 'yhan'}#update添加多个可迭代对象的元素setA.update(['wang','lei'],('xu','ren'),{'key':'value'})#结果如下{'key', '12', 'yellow', 'ren', 'color', 'wang', 'xu', 'lei', 'name'}
移除元素

set.remove(元素) 集合中无该元素会报错

set.discard(元素) 集合中无该元素不会报错

set.pop() 随机移除集合中的元素

删除集合

使用 del A 删除集合A

清空集合

使用set.clear()移除所有元素,清空集合

集合合并

使用A.union(B) 返回一个新集合

setA = {"name","age","color"}setB = {"lili","12","yellow"}setC = setA.union(setB)print(setC)#结果如下{'color', 'lili', '12', 'yellow', 'age', 'name'}
集合获取交集

set.intersection(set1,set2,......) 方法用于返回两个或更多集合中都包含的元素,参数可添加多个集合,并返回新集合

setA = {"name","age","color"}setB = {"name","12","yellow"}#判断setA和setB中都存在的元素 并返回setCsetC = setA.intersection(setB)print(f'setA内容不变 :{setA}')print(f'setB内容不变 :{setB}')print(f'setC新集合 :{setC}')#结果如下:setA内容不变 :{'color', 'age', 'name'}setB内容不变 :{'yellow', '12', 'name'}setC新集合 :{'name'}

set.intersection_update(set1,set2,.....) 方法用于返回两个或更多集合中都包含的元素,参数可添加多个集合,修改原集合,函数结果不返回新集合

setA = {"name","age","color"}setB = {"name","12","yellow"}#判断setA和setB中都存在的元素 setA集合内容会更新setC = setA.intersection_update(setB)print(f'setA内容变化 :{setA}')print(f'setB内容不变 :{setB}')print(f'不返回新集合,setC为 {setC}')#结果如下:setA内容变化 :{'name'}setB内容不变 :{'yellow', 'name', '12'}不返回新集合,setC为 NonesetA内容不变 :{'color', 'age', 'name'}
集合获取差集

set.difference(set1,set2,......) 方法用于返回集合的差集,即返回的集合元素包含在要判断的集合中,但不包含在其他集合(方法的参数)中,参数可添加多个集合,并返回新集合

setA = {"name","age","color"}setB = {"name","12","yellow"}setC = {"age","12","yellow"}#取差集setD = setA.difference(setB,setC)print(f'setA内容不变 :{setA}')print(f'setB内容不变 :{setB}')print(f'setC内容不变 :{setC}')print(f'返回新集合,setD为 {setD}')#结果如下:setA内容不变 :{'age', 'color', 'name'}setB内容不变 :{'yellow', '12', 'name'}setC内容不变 :{'age', '12', 'yellow'}返回新集合,setD为 {'color'}

set.difference_update(set1,set2,.....) 用于返回集合的差集,即返回的集合元素包含在要判断的集合中,但不包含在其他集合(方法的参数)中,该方法修改原集合,函数结果不返回新集合

setA = {"name","age","color"}setB = {"name","12","yellow"}setC = {"age","12","yellow"}setD = setA.difference_update(setB,setC)print(f'setA内容变化 :{setA}')print(f'setB内容不变 :{setB}')print(f'setC内容不变 :{setC}')print(f'返回新集合,setD为 {setD}')#结果如下:setA内容变化 :{'color'}setB内容不变 :{'name', '12', 'yellow'}setC内容不变 :{'age', '12', 'yellow'}不返回新集合,setD为 None

共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

标签: #python里面的set #python的set集合操作 #pythonlei #python中class set