Python语言之集合
小标 2018-08-09 来源 : 阅读 944 评论 0

摘要:本文主要向大家介绍了Python语言之集合,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

本文主要向大家介绍了Python语言之集合,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

集合
1.  集合的定义
  在Python中, 集合是基本数据类型的一种集合类型,它有可变集合set()和不可变集合frozenset()两种。Python中的集合类似列表,但每个元素都必须时独一无二的,且是无序的。
  集合set和集合frozenset的区别如下:
  集合set是可变的,有add(),remove()等方法。由于集合set是可变的,所以它不存在哈希值。基本功能包括关系测试和消除重复元素。集合对象还支持union(联合)、 intersection(交集)、 difference(差集)和sysmmetric difference(对称差集)等数学运算。
  集合set支持 N in set, len(set),和 for N in set。作为一个无序的集合,集合set不记录元素位置或者插入点。因此,集合set不支持 indexing, 或其它类序列的操作。
  集合frozenset()是不可变的,存在哈希值,优点是它可以作为字典的key,也可以作为其它集合的元素。缺点是一旦创建便不能更改,没有add(),remove()方法。
  因此,Python中集合的作用主要是:去重,把一个列表变成集合,就自动去重;关系测试,测试两组数据之间的交集、差集、并集等关系。
 
2.  集合的操作
  在Python中,集合set的常用操作包括:创建集合set、集合set增加、集合set删除、集合的交集、集合的并集、集合的差集等。
 
2.1 集合的创建
  在Python中,集合的创建可以使用集合的工厂函数set()和frozenset(),但是,set()创建的集合时可变的,frozenset()创建的集合时不可变的,其语法格式分别如下:
  集合名 = set(集合值)
       集合名 = frozenset(集合值)  
  
  (1)创建空集合
  在Python中,当不指定集合的值时,使用工厂函数set()和frozenset()即可创建一个空集合。
  例如,创建空集合。  
  代码:

1 a =set()
2 b = frozenset()
3 print(a)
4 print(b)

  运行结果:

1 set()
2 frozenset()

 
  (2)用set()方法创建集合  
  例如,用set()方法创建一个0到10之间的奇数的集合,并打印出来。
  代码:

1 number_odd = []
2 for number in range(1,11,2):
3     number_odd.append(number)
4 number_opp_set =set(number_odd)
5 print(number_opp_set)

  说明:
  第1行,创建一个空列表。
  第2~3行,用函数range()循环生成0到10之间的奇数,然后增加到空列表中。
  第4行,将列表中的值传给方法set(),生成一个集合。
 
  运行结果:

1 {1, 3, 5, 7, 9}

  以上的代码可以通过列表解析的方式优化为:
  代码1:

1 number_opp_set =set(number for number in range(1,11,2))
2 print(number_opp_set)

  说明:
  因为Python是解释性语言,代码越少,解释花费的时间也少。
 
  运行结果1:

1 {1, 3, 5, 7, 9} 

 
 (3)用frozenset()方法创建集合  
  例如,用frozenset()方法创建一个0到10之间的奇数的集合,并打印出来。
  代码:

1 number_opp_set_0 =frozenset(number for number in range(1,11,2))
2 print(number_opp_set_0)

 
  运行结果:

1 frozenset({1, 3, 5, 7, 9})

 
2.2  集合的增加
  在python中,集合的增加有两种常用方法:add()方法和update()方法。
  (1) add()方法
  集合的add()方法是把要传入的元素做为一个整体增加到集合中,即实现单元素增加。
  例如,定义一个0到10的奇数的集合,然后再用add()方法往里面增加一个偶数2和18,然后再打印出来。
  代码:

1 number_opp_set =set(number for number in range(1,11,2))
2 print(number_opp_set)
3 number_opp_set.add(2)
4 number_opp_set.add(18)
5 print(number_opp_set)

  说明:
  第3、4行,都是时使用add()方法分别向集合中增加偶数2和18。
  
  运行结果:

1 {1, 3, 5, 7, 9}
2 {1, 2, 3, 5, 7, 9, 18}

 
  (2)update()方法
  集合update()方法是把要传入的元素拆分,做为单个个体增加到集合中,即多元素增加。
  例如,定义一个0到10的奇数的集合,然后再用update()方法往里面增加一个偶数2和18,然后再打印出来。
  代码:

1 number_opp_set =set(number for number in range(1,11,2))
2 print(number_opp_set)
3 number_opp_set.update('2')
4 number_opp_set.update('18')
5 print(number_opp_set)

  说明:
  第3、4行,分别调用update()方法分别向集团中增加偶数2和18.
 
  运行结果:

1 {1, 3, 5, 7, 9}
2 {1, 3, 5, 7, 9, '2', '8', '1'}

  从以上的运行结果中可知,偶数18倍拆分为1和8分别增加到集合中,并且增加的值都被单引号引起来,这表示增加的是字符窜。这并不是我们需要的结果。
  在Python中,如果调用update()方法向集合中增加两个或多个字符组成的值时,该值需要使用中括号或者花括号括起来,即表示为字典或列表的形式。
  例如,定义一个0到10的奇数的集合,然后再用update()方法往里面增加一个偶数2和18,即奇数19,然后再打印出来。
  代码:

1 number_opp_set =set(number for number in range(1,11,2))
2 print(number_opp_set)
3 number_opp_set.update('2')
4 number_opp_set.update(['18'])
5 number_opp_set.update({'19'})
6 print(number_opp_set)

 
  运行结果:

1 {1, 3, 5, 7, 9}
2 {1, 3, 5, 7, 9, '18', '2', '19'}

 
2.3 集合的删除
  在Python中,集合的删除分为两种,一种是删除集合中的值;一种是删除整个集合。
  (1)删除整个集合
  在Python中,当我们需要删除整个集合中时,可使用del 语句直接删除。
  例如,将1.2.2 中创建的集合删除。
  代码:

1 number_opp_set =set(number for number in range(1,11,2))
2 print("集合删除前:",number_opp_set)
3 del  number_opp_set
4 print("集合删除后:",number_opp_set)

  说明:
  第2行,使用del语句删除集合number_opp_set。
 
  运行结果:

1 集合删除前: {1, 3, 5, 7, 9}
2 Traceback (most recent call last):
3   File "F:/PyProject/s14/day2/test_set.py", line 6, in 
4     print("集合删除后:",number_opp_set)
5 NameError: name 'number_opp_set' is not defined

  从以上的运行结果可知,使用del语句删除集合时一种永久性的,删除后就集合就不能再被使用。
 
  (2)删除集合中的值
  在Python中,当我们需要删除集合中的值时,可使用remove()方法、discard()方法及pop()方法。
  注意:remove()方法和discard()方法都能删除指定的集合的值,但如果指定的值在集合中找不到,则会提示错误,而discard()方法不会;pop()方法是随机删除集合中的任意一个值。
  例如,将1.2.2 中增加到集合中的值删除。
  代码:

 1 number_opp_set =set(number for number in range(1,11,2))
 2 print(number_opp_set)
 3 number_opp_set.update('2')
 4 number_opp_set.update(['18'])
 5 number_opp_set.update({'19'})
 6 print(number_opp_set)
 7 number_opp_set.remove('2')
 8 number_opp_set.discard('18')
 9 number_opp_set.pop()
10 print(number_opp_set)

  说明:
  第7行,调用remove()方法从集合中删除前面增加到集合中的值2,并且remove()中的参数必须用引号引起来,否则Python解释器无法解析,会提示错误。
  第8行,调用discard()方法从集合中删除前面增加到集合中的值18,方法discard()中的参数如果全是数字,不用引号引起来也不会报错,但集合中的值18不会被删除,不用引号引起来,Python解释器解析不到该值。
 
  运行结果:

1 {1, 3, 5, 7, 9}
2 {1, 3, 5, '19', 7, 9, '2', '18'}
3 {3, 5, 7, 9, '19'}

  从以上的运行结果可知,由于pop()方法是随机删除集合中的任意一个值,所以将原集合中的值1删除了,但增加的值19仍然存在集合中。
 
2.3 集合的访问
  在Python中,集合的访问主要有两种,一种是访问整个集合,一种的集合的遍历。
  (1)访问整个集合
  在Python中,访问整个集合,可以直接使用。
  例如,创建一个1到10之间的数字组成的偶数的集合,并访问整个集合。
  代码:

1 number_even_set =set(number for number in range(2,11,2))
2 print(number_even_set)

  说明:
  第1行,使用range()函数和for循环,从2开始,依次遍历到10,且步长为2,再用set()方法,将所有遍历过程中满足步长为2的数字创建为一个集合。
  第2行,直接用print打印整个集合。
 
  运行结果:

1 {2, 4, 6, 8, 10}

 
  (2)访问集合中的每个值
  在Python中,我们可以使用for循环来遍历访问集合中的每个值。
  例如,创建一个1到10之间的数字组成的偶数的集合,并遍历访问集合中的每个值。
  代码:

1 number_even_set =set(number for number in range(2,11,2))
2 print(number_even_set)
3 for number_evven in number_even_set:
4     print(number_evven)

 
  运行结果:

1 {2, 4, 6, 8, 10}
2 2
3 4
4 6
5 8
6 10

 
3.  集合的关系测试
  在Python中,集合的关系测试包括:并集、交集、差集等等。
3.1 并集
  集合中,并集也叫合集,即将一个集合和另一个集合合并为一个集合的过程。求并集使用函数union()或者运算符“|”。
  例如,创建一个1到10之间的数字组成的偶数的集合和奇数集合,然后求其并集。
  代码:

 1 number_opp_set =set(number for number in range(1,11,2))
 2 print(number_opp_set)
 3 number_even_set =set(number for number in range(2,11,2))
 4 print(number_even_set)
 5 print("-----第一种方式:用函数union()求并集-----")
 6 number_set = number_opp_set.union(number_even_set)
 7 print(number_set)
 8 print("-----第二种方式:用运算符'|'求并集-----")
 9 _number_set = number_opp_set | number_even_set
10 print(_number_set)

 
 说明:
  第6行,用函数union()将集合number_opp_set和集合number_even_set合并后赋值给变量number_set。
  第7行,用运算符 ‘|’ 将集合number_opp_set和集合number_even_set合并后赋值给变量_number_set。
  
  运行结果:

1 {1, 3, 5, 7, 9}
2 {2, 4, 6, 8, 10}
3 -----第一种方式:用函数union()求并集-----
4 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
5 -----第二种方式:用运算符'|'求并集-----
6 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

  从以上的运行结果可知,求两个集合的并集可以使用函数union()或运算符 ‘|’ ,其结果是一致的。
 
3.2 交集
  交集就是两个集合中都有的部分,用函数intersection()或运算符 ‘&’求两个集合的交集。
  例如,创建一个1到5的数字组成的集合,再创建一个0到10的奇数组成的集合,然后求其交集。
  代码:

 1 number_set_a =set(number for number in range(1,6))
 2 print(number_set_a)
 3 number_opp_set =set(number for number in range(1,11,2))
 4 print(number_opp_set)
 5 print("-----第一种方式:intersection()求交集-----")
 6 number_set = number_set_a.intersection(number_opp_set)
 7 print(number_set)
 8 print("-----第二种方式:用运算符 '&'求交集-----")
 9 _number_set = number_set_a & number_opp_set
10 print(_number_set)

  说明:
  第6行,使用函数intersection()求集合number_set_a和集合number_opp_set的交集,并赋值给变量number_set。
  第9行,使用运算符 ‘&’ 求集合number_set_a和集合number_opp_set的交集,并赋值给变量_number_set。 
  运行结果:

1 {1, 2, 3, 4, 5}
2 {1, 3, 5, 7, 9}
3 -----第一种方式:intersection()求交集-----
4 {1, 3, 5}
5 -----第二种方式:用运算符 '&'求交集-----
6 {1, 3, 5}

  从以上的运行结果可知,通过函数intersection()或运算符 ‘&’ ,都可以求两个集合交集。
 
3.3 差集
  差集就是在两个集合中,在集合a中有,但集合b中没有的部分,或者集合b中有,但集合a中没有的部分。因此我们可使用函数difference()或运算符 ‘-’ 求差集。
  例如,创建一个1到5的数字组成的集合,再创建一个0到10的奇数组成的集合,然后求其差集。
  代码:

 1 number_set_a =set(number for number in range(1,6))
 2 print(number_set_a)
 3 number_opp_set =set(number for number in range(1,11,2))
 4 print(number_opp_set)
 5 print("-----第一种方式:difference()求差集-----")
 6 number_set = number_set_a.difference(number_opp_set)
 7 print(number_set)
 8 _number_set = number_opp_set.difference(number_set_a)
 9 print(_number_set)
10 print("-----第二种方式:用运算符 '-'求差集-----")
11 _number_set_ = number_set_a- number_opp_set
12 print(_number_set_)
13 __number_set__ = number_opp_set - number_set_a
14 print(__number_set__)

  说明:
  第6行,使用函数difference()求集合number_set_a中有,但集合number_opp_set中没有的部分,并赋值给变量number_set。
  第8行,使用函数difference()求集合number_opp_set中有,但集合number_set_a中没有的部分,并赋值给变量_number_set。
  第11行,使用运算符 '-' 求集合number_set_a中有,但集合number_opp_set中没有的部分,并赋值给变量_number_set_。
  第13行,使用运算符 '-' 求集合number_opp_set中有,但集合number_set_a中没有的部分,并赋值给变量__number_set__。
 
  运行结果:

1 {1, 2, 3, 4, 5}
2 {1, 3, 5, 7, 9}
3 -----第一种方式:difference()求差集-----
4 {2, 4}
5 {9, 7}
6 -----第二种方式:用运算符 '-'求差集-----
7 {2, 4}
8 {9, 7}

 
3.4 子集
  判断集合a是否是集合b的子集,使用函数issubset()或运算符 ‘<=’。
  例如,创建一个1到10的数字组成的集合,再创建一个0到10的奇数组成的集合,然后求其子集。
  代码:

 1 number_set_a =set(number for number in range(1,11))
 2 print(number_set_a)
 3 number_opp_set =set(number for number in range(1,11,2))
 4 print(number_opp_set)
 5 print("-----第一种方式:issubset()求子集-----")
 6 number_set = number_set_a.issubset(number_opp_set)
 7 print(number_set)
 8 _number_set = number_opp_set.issubset(number_set_a)
 9 print(_number_set)
10 print("-----第二种方式:用运算符 '<='求子集-----")
11 _number_set_ = number_set_a <= number_opp_set
12 print(_number_set_)
13 __number_set__ = number_opp_set <= number_set_a
14 print(__number_set__)

 
 说明:
  第6行,用函数issubset()判断集合number_set_a是否是集合number_opp_set的子集,判断结果赋值给变量number_set。
  第8行,用函数issubset()判断集合number_opp_set是否是集合number_set_a的子集,判断结果赋值给变量_number_set。
  第11行,用运算符 '<= ' 判断集合number_set_a是否是集合number_opp_set的子集,判断结果赋值给变量_number_set_。
  第13行,用运算符 '<= ' 判断集合number_opp_set是否是集合number_set_a的子集,判断结果赋值给变量__number_set__。
 
  运行结果:

1 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
2 {1, 3, 5, 7, 9}
3 -----第一种方式:issubset()求子集-----
4 False
5 True
6 -----第二种方式:用运算符 '<= 7="" 8="" 3.5="">='。
  例如,创建一个1到10的数字组成的集合,再创建一个0到10的奇数组成的集合,然后求其父集。
  代码:

 1 number_set_a =set(number for number in range(1,11))
 2 print(number_set_a)
 3 number_opp_set =set(number for number in range(1,11,2))
 4 print(number_opp_set)
 5 print("-----第一种方式:issuperset()求父集-----")
 6 number_set = number_set_a.issuperset(number_opp_set)
 7 print(number_set)
 8 _number_set = number_opp_set.issuperset(number_set_a)
 9 print(_number_set)
10 print("-----第二种方式:用运算符 '>='求父集-----")
11 _number_set_ = number_set_a >= number_opp_set
12 print(_number_set_)
13 __number_set__ = number_opp_set >= number_set_a
14 print(__number_set__)

    说明:
  第6行,用函数issuperset()判断集合number_set_a是否是集合number_opp_set的父集,判断结果赋值给变量number_set。
  第8行,用函数issuperset()判断集合number_opp_set是否是集合number_set_a的父集,判断结果赋值给变量_number_set。 
  第11行,用运算符 ‘>=’ 判断集合number_set_a是否是集合number_opp_set的父集,判断结果赋值给变量_number_set_。
  第13行,用运算符 ‘>=’ 判断集合number_opp_set是否是集合number_set_a的父集,判断结果赋值给变量__number_set__。
  
运行结果:

1 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
2 {1, 3, 5, 7, 9}
3 -----第一种方式:issuperset()求父集-----
4 True
5 False
6 -----第二种方式:用运算符 '>='求父集-----
7 True
8 False

 
3.6 对称差集
  对称差集就是求两个集合中的剔除公共的部分的集合。
  例如,创建一个1到5的数字组成的集合,再创建一个0到10的奇数组成的集合,然后求其对称差集。
  代码:

 1 number_set_a =set(number for number in range(1,6))
 2 print(number_set_a)
 3 number_opp_set =set(number for number in range(1,11,2))
 4 print(number_opp_set)
 5 print("-----第一种方式:symmetric_difference()求对称差集-----")
 6 number_set = number_set_a.symmetric_difference(number_opp_set)
 7 print(number_set)
 8 _number_set = number_opp_set.symmetric_difference(number_set_a)
 9 print(_number_set)
10 print("-----第二种方式:用运算符 '^ '求对称差集-----")
11 _number_set_ = number_set_a ^  number_opp_set
12 print(_number_set_)
13 __number_set__ = number_opp_set ^  number_set_a
14 print(__number_set__)

  说明:  
  第6行,使用函数symmetric_difference()求集合number_set_a和集合number_opp_set的对称差集,并赋值给变量number_set。
  第8行,使用函数symmetric_difference()求集合number_opp_set和集合number_set_a的对称差集,并赋值给变量_number_set。
  第11行,使用运算符 ‘^’ 求集合number_set_a和集合number_opp_set的对称差集,并赋值给变量_number_set_。
  第13行,使用运算符 ‘^’ 求集合number_opp_set和集合number_set_a的对称差集,并赋值给变量__number_set__。
  
  运行结果:

1 {1, 2, 3, 4, 5}
2 {1, 3, 5, 7, 9}
3 -----第一种方式:symmetric_difference()求对称差集-----
4 {2, 4, 7, 9}
5 {2, 4, 7, 9}
6 -----第二种方式:用运算符 '^ '求对称差集-----
7 {2, 4, 7, 9}
8 {2, 4, 7, 9}

    从以上的运行结果可知,求两个集合的对称差集时,哪个集合写在函数中或前后都行,其结果都一样。

本文由职坐标整理并发布,希望对同学们学习Python有所帮助,更多内容请关注职坐标编程语言Python频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程