5.【Python编程】集合Set相关知识及基本操作

5.【Python编程】集合Set相关知识及基本操作

备注: 本教程主要使用Python3.6在jupyter notebook上编程实现。Python环境配置参考《【Python学习】Windows10开始你的Anaconda安装与Python环境管理》或者《【Python学习】纯终端命令开始你的Anaconda安装与Python环境管理》

5.1 集合的创建

集合(set)是一个无序的不重复元素序列。可以使用大括号{ }或者set()函数创建集合,注意:创建一个空集合必须用set()而不是{ },因为{ }是用来创建一个空字典。此外,集合中的元素必须是不可变类型
python3版本,对于数据量很小的集合并且数字很少的时候,确实是做了一个排序,但集合的本质还是无序的!
Python内置的集合set中元素顺序是按元素的哈希值进行存储的,并不是按先后顺序。

set1 = {"北京","上海","广州","深圳","成都"}
print(set1)
set2 = set()
print(set2)
list1 = [1,1,1,2,2,3,4,5,6,7,8,8,9,10]
set3 = set(list1)  # 集合具有去重功能
print(set3)
{'成都', '深圳', '上海', '广州', '北京'}
set()
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
# 集合的元素是按元素的哈希值进行存储的
set4 = set([9,4,1,6,100,101,119,222,333,301,1000,1301,200])
print(set4)

set4_2 = set([9,4,1,6,100,101,119,222,333,301,1000,1301,200])
print(set4_2)

set5 = set([4,9,1,6,222,101,119,100,333,301,1000,1301,200])
print(set5)
{1, 100, 4, 6, 101, 1000, 9, 200, 333, 301, 1301, 119, 222}
{1, 100, 4, 6, 101, 1000, 9, 200, 333, 301, 1301, 119, 222}
{1, 4, 101, 6, 100, 1000, 9, 200, 333, 301, 1301, 119, 222}

5.2 集合的常见操作

  • 集合推导式
# 找出字符串'我是中国人,中国人不骗中国人'中存在而字符串'我是谁'中不存在的所有元素
set1 = {x for x in '我是中国人,中国人不骗中国人' if x not in '我是谁'} # 与列表推导式的区别是使用了“{}”
print(set1)
{',', '国', '中', '骗', '不', '人'}
  • 计算集合的元素个数
empty_set = set()
print("len(empty_set)=", len(empty_set))
set1 = {1,3,5,7,9}
print("len(set1)=", len(set1))
len(empty_set)= 0
len(set1)= 5
  • 清空集合
set1 = {1,3,5,7,9}
print(set1)
set1.clear()
print("执行set1.clear()之后...")
print(set1) # set()表示空集
{1, 3, 5, 7, 9}
执行set1.clear()之后...
set()
  • 集合增加元素
A = {1,2,3,4,5,6}
print(A)
A.add(1)
print(A)
A.add(7)
print(A)
{1, 2, 3, 4, 5, 6}
{1, 2, 3, 4, 5, 6}
{1, 2, 3, 4, 5, 6, 7}

A.update(x)可以添加元素,且参数可以是列表,元组,字典

A = {1,2,3,4,5,6}
A.update([1,3],[8,9]) # 列表
print(A)
A.update((11,12,13)) # 元组
print(A)
A.update({15,16,17}) # 集合
print(A)
A.update({18:19,20:21}) # 字典
print(A) # 字典的键会被添加到集合当中
{1, 2, 3, 4, 5, 6, 8, 9}
{1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13}
{1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17}
{1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17, 18, 20}
  • 移除集合当中的元素
A = {1,2,3,4,5,6}
A.remove(1)
#A.remove(7) # 元素必须在集合当中,否则会报错如下:
'''
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-26-d5cf803bb5a2> in <module>
      1 A = {1,2,3,4,5,6}
      2 A.remove(1)
----> 3 A.remove(7) # 元素必须在集合当中,否则会报错如下:
KeyError: 7
'''
print(A)
A.discard(2) # # 元素不一定需要在集合当中
A.discard(8)
print(A)
{2, 3, 4, 5, 6}
{3, 4, 5, 6}

集合里只有0~31范围内的数字,执行.pop()删除时, 删掉的是最小的数字, 其余数字升序排列
实际上,.pop执行的是删除实际存储在集合当中最前面的元素

set1 = {9,31,4,1,6,21,8,3,11,0,21,24,25,29} #,99,21,35,33,34}
print("set1:",set1) # 自动按从小到大排序
set1.pop() 
print("set1:",set1)
set1.pop()
print("set1:",set1)
set1.pop()
print("set1:",set1)

set2 = {9,4,1,6,100,101,119,222,333,301,1000,1301,200}
print("set2:",set2) # 自动按从小到大排序
set2.pop() # 移除1
print("set2:",set2)
set2.pop() # 移除100
print("set2:",set2)
set2.pop() # 移除4
print("set2:",set2)

set3= set('我是中国人')
print("set3:",set3)
set3.pop()
print("set3:",set3)
set3.pop()
print("set3:",set3)
set3.pop()
print("set3:",set3)
set1: {0, 1, 3, 4, 6, 8, 9, 11, 21, 24, 25, 29, 31}
set1: {1, 3, 4, 6, 8, 9, 11, 21, 24, 25, 29, 31}
set1: {3, 4, 6, 8, 9, 11, 21, 24, 25, 29, 31}
set1: {4, 6, 8, 9, 11, 21, 24, 25, 29, 31}
set2: {1, 100, 4, 6, 101, 1000, 9, 200, 333, 301, 1301, 119, 222}
set2: {100, 4, 6, 101, 1000, 9, 200, 333, 301, 1301, 119, 222}
set2: {4, 6, 101, 1000, 9, 200, 333, 301, 1301, 119, 222}
set2: {6, 101, 1000, 9, 200, 333, 301, 1301, 119, 222}
set3: {'国', '中', '是', '我', '人'}
set3: {'中', '是', '我', '人'}
set3: {'是', '我', '人'}
set3: {'我', '人'}

5.3 集合的基本运算

set()list()的区别

# 利用set的特性,计算字符串有多少个不同的字符
sentence_set = set('我是中国人,中国人不骗中国人')
print(sentence_set)
print('句子中的不同字符个数:',len(sentence_set))
# 利用list把句子转化为字组成的列表,BERT、GPT模型常用的NLP处理操作
sentence_list = list('我是中国人,中国人不骗中国人')
print(sentence_list)
print('句子的长度:',len(sentence_list))
{'我', ',', '国', '骗', '是', '人', '中', '不'}
8
['我', '是', '中', '国', '人', ',', '中', '国', '人', '不', '骗', '中', '国', '人']

两个集合的基本运算

  • 并集:集合A或者集合B中存在的元素
A = {1,2,3,4}
B = {3,4,5,6}
print("集合A与B的并集:",A | B)
C = A.union(B) # C=A+B,union: 联合
print("集合A与B的并集:", C)
集合A与B的并集: {1, 2, 3, 4, 5, 6}
集合A与B的并集: {1, 2, 3, 4, 5, 6}
  • 交集:集合A与集合B中都存在的元素
A = {1,2,3,4}
B = {3,4,5,6}
print("集合A与B的交集:",A & B)
D = A.intersection(B) # D=A+B,intersection: 交叉
print("集合A与B的交集:", D)
集合A与B的交集: {3, 4}
集合A与B的交集: {3, 4}
  • 补集/差集:集合A中存在而集合B中不存在的元素
A = {1,2,3,4}
B = {3,4,5,6}
print("集合A与B的差运算:",A - B)
E = A.difference(B) # E=A-B
print("集合A与B的差运算",E)
集合A与B的差运算: {1, 2}
集合A与B的差运算 {1, 2}
  • A^B= (A-(A&B))|(B-(A&B))
A = {1,2,3,4}
B = {3,4,5,6}
print("集合A与B中不同时存在的元素:",A ^ B)
F = A.symmetric_difference(B)
print("集合A与B中不同时存在的元素:",F)
print("集合A与B中不同时存在的元素:",(A-(A&B))|(B-(A&B)))
集合A与B中不同时存在的元素: {1, 2, 5, 6}
集合A与B中不同时存在的元素: {1, 2, 5, 6}
集合A与B中不同时存在的元素: {1, 2, 5, 6}

5.4 元素与集合的关系

A = {1,2,3,4,5,6,7}
print(1 in A)
print(8 in A)
True
False
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YirongChen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值