Pyhton基础学习系列12——集合

一、集合是什么?

  1. 容器型数据类型,将{ } 作为容器的标志,里面多个数据用逗号隔开:{数据1,数据2,数据3,…}
  2. 集合是可变的;集合是无序的
  3. 集合和我们以前高中学的集合是一样的,支持交集、并集、差集等集合之间的运算
  4. 集合里面的元素必须是不可变类型的数据并且是唯一的,这就代表着集合拥有自动去重的功能。

二、集合的基本操作

1.创建集合

  • 可以使用set()函数,也可以直接用{ }来创建
  • 但注意字典和集合的容器标志都是{ },如果要创建一个空集合只能用set()函数,直接写一个{ }代表的是空字典
# 直接写一个{}代表的是空字典
dict1 = {}
print(len(dict1),type(dict1))
# 0 <class 'dict'>
# 空集合
s1 = set()
print(len(s1), type(s1))
# 0 <class 'set'>

# 当{}里面有数据时可以代表是集合
# 元素是唯一的,可以自动去重
s3 = {10, 20, 10, 10, 30, 20}
print(s3)
# {10, 20, 30}
print(type(s3))
# <class 'set'>

2.集合的增删改查以及其他操作

1.查 - 查询集合里面的元素

  • 因为集合是无序的,所以没有下标,也没有键,所以没办法直接到指定位置进行查操作
  • 可以用循环遍历获取元素中的内容
names = {'琴酒', '灰原哀', '柯南', '毛利兰','贝尔摩德'}
for i in names:
    print(i)
# 毛利兰 贝尔摩德 柯南 灰原哀 琴酒 
# 因为集合是无序的所以输出来的结果不会像列表一样按照顺序取。
  • 使用 innot in 判断集合里面有没有这个元素
names = {'琴酒', '灰原哀', '柯南', '毛利兰','贝尔摩德'}
print('琴酒' in names) # True
print('琴酒' not in names) # False

2.增 - 往集合里面添加元素

  • add()函数 - 如果添加的元素在集合中已存在,则不执行任何操作。
names = {'琴酒', '灰原哀', '柯南', '毛利兰','贝尔摩德'}
names.add('阿笠博士')
print(names)
{'灰原哀', '琴酒', '柯南', '阿笠博士', '毛利兰', '贝尔摩德'}
  • update()函数 - 添加新的元素或集合到当前集合中,如果添加的元素在集合中已存在,则该元素只会出现一次,重复的会忽略。
  • 函数里面的参数必须是可迭代的对象不然会报错
  • 可迭代对象简单来说就是可以遍历的对象
names = {'琴酒', '灰原哀', '柯南', '毛利兰','贝尔摩德'}
# 注意这里如果直接写成names.update('赤井秀一'),那么会把字符串里面的四个字符一个一个的添加进去,所以元组或者集合来添加,
names.update('赤井秀一')
print(names)
# {'贝尔摩德', '赤', '琴酒', '一', '灰原哀', '井', '毛利兰', '秀', '柯南'}
# names.update(('赤井秀一',)) 等同于 names.update({'赤井秀一'})
names.update({'赤井秀一'})
print(names)
# {'贝尔摩德', '赤井秀一', '琴酒', '灰原哀', '毛利兰', '柯南'}

# 如果添加的是字典,只会把键添加进去,因为集合里面的数据是不可变的,键不可变
names = {'琴酒', '灰原哀', '柯南', '毛利兰','贝尔摩德'}
names.update({0:'赤井秀一'})
print(names)
# {0, '贝尔摩德', '柯南', '灰原哀', '琴酒', '毛利兰'}

3.删 - 删除集合里面的元素

  • remove() - 删除集合中指定元素(如果元素不存在会报错)
names = {'琴酒', '灰原哀', '柯南', '毛利兰','贝尔摩德'}
names.remove('琴酒')
print(names)
# {'贝尔摩德', '毛利兰', '灰原哀', '柯南'}
  • discard() - 删除集合中指定元素(和remove相反如果元素不存在也不会报错)
names = {'琴酒', '灰原哀', '柯南', '毛利兰','贝尔摩德'}
names.discard('琴酒')
print(names)
# {'毛利兰', '灰原哀', '贝尔摩德', '柯南'}
  • pop()函数 - 和列表的pop操作一样都是取走一个元素,完成删除的效果,但因为集合是无序的,所以和列表的区别是:函数括号里面不放参数,集合的pop操作不知道取走的是哪一个值,完全随机,但是也是可以存起来使用的。
names = {'琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德'}
A = names.pop()
print(A)
# 琴酒
print(names)
# {'贝尔摩德', '柯南', '灰原哀', '毛利兰'}
# 第一次运行可能是琴酒,第二次可能是柯南,也有可能两次都是同一个元素,完全随机。
  • 进行删除功能的还有delclear,一个是直接删除整个的集合,直接是把内存的地址一起删除,输出会报错,说集合没定义。而clear是删除集合里面的所有元素,返回None
names = {'琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德'}
print(names.clear())
# None

names = {'琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德'}
del names
print(names)
# NameError: name 'names' is not defined

4.改 - 修改集合里面的元素

  • 因为集合里面的元素是不可变的数据类型,所以无法修改内容,只能先进行删除操作,再添加新的元素进去,达到修改的效果.
names = {'琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德'}
# 先删除
names.remove('琴酒')
# 再添加
names.add('赤井秀一')
print(names)
# {'毛利兰', '柯南', '贝尔摩德', '赤井秀一', '灰原哀'}

5.集合的其他操作

  • 集合不支持+、*的操作,但是我们可以使用update()函数来达到两个集合相加的效果
s1 = {10, 20, 100, 90, 80}
s2 = {35, 45}
s1.update(s2)
print(s1)
# {80, 35, 100, 20, 90, 10, 45}
  • 集合可以使用sum、max、min、sorted等函数
s1 = {10, 20, 100, 90, 80}
print(10 in s1)
print(sum(s1), max(s1), min(s1), sorted(s1), len(s1), set('abc'))
# True
# 300 100 10 [10, 20, 80, 90, 100] 5 {'c', 'a', 'b'}

三、集合的数学运算

1.交集 - &

  • 集合论中,设A,B是两个集合,由所有属于集合A且属于集合B的元素所组成的集合,叫做集合A与集合B的交集(intersection),记作A∩B。
  • 集合1 & 集合2 - 求两个集合的公共部分
s1 = {1, 2, 3, 4, 5, 6, 7}
s2 = {5, 6, 7, 8, 9, 10}
# 1)交集  -   &
# 集合1 & 集合2     -   求两个集合的公共部分
print(s1 & s2)
# {5, 6, 7}

2.并集 - |

  • 给定两个集合A,B,把他们所有的元素合并在一起组成的集合,叫做集合A与集合B的并集,记作A∪B,读作A并B。
  • 集合1 | 集合2 - 将两个集合合并成一个集合
s1 = {1, 2, 3, 4, 5, 6, 7}
s2 = {5, 6, 7, 8, 9, 10}
print(s1 | s2)
# {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

3.差集 - -

  • 记A,B是两个集合,则所有属于A且不属于B的元素构成的集合,叫做集合A减集合B(或集合A与集合B之差),类似地,对于集合A、B,把集合{x∣x∈A,且x∉B}叫做A与B的差集。
  • 集合1 - 集合2 - 获取集合1中没有包含在集合2中的部分
  • 集合2 - 集合1 - 获取集合2中没有包含在集合1中的部分
s1 = {1, 2, 3, 4, 5, 6, 7}
s2 = {5, 6, 7, 8, 9, 10}
print(s1 - s2)          # {1, 2, 3, 4}
print(s2 - s1)          # {8, 9, 10}

4.对称差集 - ^

  • 集合1 ^ 集合2 - 两个集合相互求差集将结果合并成一个集合(将两个集合合并成一个集合,然后不要公共部分)
s1 = {1, 2, 3, 4, 5, 6, 7}
s2 = {5, 6, 7, 8, 9, 10}
print(s1 ^ s2)          # {1, 2, 3, 4, 8, 9, 10}

5.子集(>=、<=)和真子集(>、<)

  • 子集 - 如果集合A的任意一个元素都是集合B的元素,那么集合A称为集合B的子集
  • 集合1 >= 集合2 - 判断集合2是否是集合1的子集
  • 集合1 <= 集合2 - 判断集合1是否是集合2的子集
s1 = {100, 200, 300}
s2 = {100, 200, 300, 400}
print(s1 >= {1, 2})     # False
print(s1 >= {100, 200}) # True
print(s1 <= s2) # True
  • 真子集 - 如果集合A是集合B的子集,并且集合B不是集合A的子集,那么集合A叫做集合B的真子集
  • 集合1 > 集合2 - 判断集合2是否是集合1的真子集
  • 集合1 < 集合2 - 判断集合1是否是集合2的真子集
s1 = {100, 200, 300}
print(s1 > {1, 2})  # False
print(s1 > {100})  # True
  • 符号的箭头指向哪个集合,就是判断它是不是另一个集合的子集或者真子集

四、集合推导式

  • 基本和列表推导式一样
  • 格式1:{表达式 for 变量 in 容器(可迭代对象)}
  • 格式2:{表达式 for 变量 in 容器(可迭代对象) if条件}
set1 = {x for x in '是靖不是静'}
# 集合特点就是会自动去重
print(set1)
# {'不', '靖', '是', '静'}
# 集合特点就是会自动去重
print(type(set1))
# <class 'set'>

set1 = {x for x in range(0,11) if x % 2 == 0}
print(set1)
print(type(set1))
# {0, 2, 4, 6, 8, 10}
# <class 'set'>

总结

容器型数据类型,将{ } 作为容器的标志,集合是可变的;集合是无序的,可以支持我们以前数学里面的交集、并集等运算,自带去重功能,集合的元素必须是不可变的类型数据。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值