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

文档目录

1. 集合的定义

2. 集合的无序性

3. 集合的去重

4. 集合推导式

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

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

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

集合的定义

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


setB = {'color','name'}
print(type(setB))
#打印结果

  
setC = set(['color','name'])
print(type(setC))
#打印结果

集合的无序性

#定义一个集合
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 
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 
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 OrderedDict
listC = 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 数据类型: 内容:{'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中都存在的元素 并返回setC
setC = 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


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

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

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

展开阅读全文

页面更新:2024-06-05

标签:字典   数据类型   函数   元素   定义   对象   参数   功能   方法   内容   列表

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top