集合

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()即可创建一个空集合。

  例如,创建空集合。  

  代码:

 a =set()
b = frozenset()
print(a)
print(b)

  运行结果:

 set()
frozenset()

  (2)用set()方法创建集合  

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

  代码:

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

  说明:

  第1行,创建一个空列表。

  第2~3行,用函数range()循环生成0到10之间的奇数,然后增加到空列表中。

  第4行,将列表中的值传给方法set(),生成一个集合。

  运行结果:

 {1, 3, 5, 7, 9}

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

  代码1:

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

  说明:

  因为Python是解释性语言,代码越少,解释花费的时间也少。

  运行结果1:

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

 (3)用frozenset()方法创建集合  

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

  代码:

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

 

  运行结果:

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

2.2  集合的增加

  在python中,集合的增加有两种常用方法:add()方法和update()方法。

  (1) add()方法

  集合的add()方法是把要传入的元素做为一个整体增加到集合中,即实现单元素增加。

  例如,定义一个0到10的奇数的集合,然后再用add()方法往里面增加一个偶数2和18,然后再打印出来。

  代码:

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

  说明:

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

  

  运行结果:

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

  (2)update()方法

  集合update()方法是把要传入的元素拆分,做为单个个体增加到集合中,即多元素增加。

  例如,定义一个0到10的奇数的集合,然后再用update()方法往里面增加一个偶数2和18,然后再打印出来。

  代码:

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

  说明:

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

  运行结果:

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

  从以上的运行结果中可知,偶数18倍拆分为1和8分别增加到集合中,并且增加的值都被单引号引起来,这表示增加的是字符窜。这并不是我们需要的结果。

  在Python中,如果调用update()方法向集合中增加两个或多个字符组成的值时,该值需要使用中括号或者花括号括起来,即表示为字典或列表的形式。

  例如,定义一个0到10的奇数的集合,然后再用update()方法往里面增加一个偶数2和18,即奇数19,然后再打印出来。

  代码:

 number_opp_set =set(number for number in range(1,11,2))
print(number_opp_set)
number_opp_set.update('')
number_opp_set.update([''])
number_opp_set.update({''})
print(number_opp_set)

 

  运行结果:

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

2.3 集合的删除

  在Python中,集合的删除分为两种,一种是删除集合中的值;一种是删除整个集合。

  (1)删除整个集合

  在Python中,当我们需要删除整个集合中时,可使用del 语句直接删除。

  例如,将1.2.2 中创建的集合删除。

  代码:

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

  说明:

  第2行,使用del语句删除集合number_opp_set。

  运行结果:

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

  从以上的运行结果可知,使用del语句删除集合时一种永久性的,删除后就集合就不能再被使用。

  (2)删除集合中的值

  在Python中,当我们需要删除集合中的值时,可使用remove()方法、discard()方法及pop()方法。

  注意:remove()方法和discard()方法都能删除指定的集合的值,但如果指定的值在集合中找不到,则会提示错误,而discard()方法不会;pop()方法是随机删除集合中的任意一个值。

  例如,将1.2.2 中增加到集合中的值删除。

  代码:

 number_opp_set =set(number for number in range(1,11,2))
print(number_opp_set)
number_opp_set.update('')
number_opp_set.update([''])
number_opp_set.update({''})
print(number_opp_set)
number_opp_set.remove('')
number_opp_set.discard('')
number_opp_set.pop()
print(number_opp_set)

  说明:

  第7行,调用remove()方法从集合中删除前面增加到集合中的值2,并且remove()中的参数必须用引号引起来,否则Python解释器无法解析,会提示错误。

  第8行,调用discard()方法从集合中删除前面增加到集合中的值18,方法discard()中的参数如果全是数字,不用引号引起来也不会报错,但集合中的值18不会被删除,不用引号引起来,Python解释器解析不到该值。

  运行结果:

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

  从以上的运行结果可知,由于pop()方法是随机删除集合中的任意一个值,所以将原集合中的值1删除了,但增加的值19仍然存在集合中。

2.3 集合的访问

  在Python中,集合的访问主要有两种,一种是访问整个集合,一种的集合的遍历。

  (1)访问整个集合

  在Python中,访问整个集合,可以直接使用。

  例如,创建一个1到10之间的数字组成的偶数的集合,并访问整个集合。

  代码:

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

  说明:

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

  第2行,直接用print打印整个集合。

  运行结果:

 {2, 4, 6, 8, 10}

  (2)访问集合中的每个值

  在Python中,我们可以使用for循环来遍历访问集合中的每个值。

  例如,创建一个1到10之间的数字组成的偶数的集合,并遍历访问集合中的每个值。

  代码:

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

  运行结果:

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

3.  集合的关系测试

  在Python中,集合的关系测试包括:并集、交集、差集等等。

3.1 并集

  集合中,并集也叫合集,即将一个集合和另一个集合合并为一个集合的过程。求并集使用函数union()或者运算符“|”。

  例如,创建一个1到10之间的数字组成的偶数的集合和奇数集合,然后求其并集。

  代码:

 number_opp_set =set(number for number in range(,,))
print(number_opp_set)
number_even_set =set(number for number in range(,,))
print(number_even_set)
print("-----第一种方式:用函数union()求并集-----")
number_set = number_opp_set.union(number_even_set)
print(number_set)
print("-----第二种方式:用运算符'|'求并集-----")
_number_set = number_opp_set | number_even_set
print(_number_set)

 说明:

  第6行,用函数union()将集合number_opp_set和集合number_even_set合并后赋值给变量number_set。

  第7行,用运算符 ‘|’ 将集合number_opp_set和集合number_even_set合并后赋值给变量_number_set。

  

  运行结果:

 {, , , , }
{, , , , }
-----第一种方式:用函数union()求并集-----
{, , , , , , , , , }
-----第二种方式:用运算符'|'求并集-----
{, , , , , , , , , }

  从以上的运行结果可知,求两个集合的并集可以使用函数union()或运算符 ‘|’ ,其结果是一致的。

3.2 交集

  交集就是两个集合中都有的部分,用函数intersection()或运算符 ‘&’求两个集合的交集。

  例如,创建一个1到5的数字组成的集合,再创建一个0到10的奇数组成的集合,然后求其交集。

  代码:

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

  说明:

  第6行,使用函数intersection()求集合number_set_a和集合number_opp_set的交集,并赋值给变量number_set。

  第9行,使用运算符 ‘&’ 求集合number_set_a和集合number_opp_set的交集,并赋值给变量_number_set。

  运行结果:

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

  从以上的运行结果可知,通过函数intersection()或运算符 ‘&’ ,都可以求两个集合交集。

3.3 差集

  差集就是在两个集合中,在集合a中有,但集合b中没有的部分,或者集合b中有,但集合a中没有的部分。因此我们可使用函数difference()或运算符 ‘-’ 求差集。

  例如,创建一个1到5的数字组成的集合,再创建一个0到10的奇数组成的集合,然后求其差集。

  代码:

 number_set_a =set(number for number in range(1,6))
print(number_set_a)
number_opp_set =set(number for number in range(1,11,2))
print(number_opp_set)
print("-----第一种方式:difference()求差集-----")
number_set = number_set_a.difference(number_opp_set)
print(number_set)
_number_set = number_opp_set.difference(number_set_a)
print(_number_set)
print("-----第二种方式:用运算符 '-'求差集-----")
_number_set_ = number_set_a- number_opp_set
print(_number_set_)
__number_set__ = number_opp_set - number_set_a
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, 2, 3, 4, 5}
{1, 3, 5, 7, 9}
-----第一种方式:difference()求差集-----
{2, 4}
{9, 7}
-----第二种方式:用运算符 '-'求差集-----
{2, 4}
{9, 7}

3.4 子集

  判断集合a是否是集合b的子集,使用函数issubset()或运算符 ‘<=’。

  例如,创建一个1到10的数字组成的集合,再创建一个0到10的奇数组成的集合,然后求其子集。

  代码:

 number_set_a =set(number for number in range(1,11))
print(number_set_a)
number_opp_set =set(number for number in range(1,11,2))
print(number_opp_set)
print("-----第一种方式:issubset()求子集-----")
number_set = number_set_a.issubset(number_opp_set)
print(number_set)
_number_set = number_opp_set.issubset(number_set_a)
print(_number_set)
print("-----第二种方式:用运算符 '<='求子集-----")
_number_set_ = number_set_a <= number_opp_set
print(_number_set_)
__number_set__ = number_opp_set <= number_set_a
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, 2, 3, 4, 5, 6, 7, 8, 9, 10}
{1, 3, 5, 7, 9}
-----第一种方式:issubset()求子集-----
False
True
-----第二种方式:用运算符 '<='求子集-----
False
True

3.5 父集

  判断集合a是否是集合b的父集,使用函数issuperset()或运算符 '>='。

  例如,创建一个1到10的数字组成的集合,再创建一个0到10的奇数组成的集合,然后求其父集。

  代码:

 number_set_a =set(number for number in range(1,11))
print(number_set_a)
number_opp_set =set(number for number in range(1,11,2))
print(number_opp_set)
print("-----第一种方式:issuperset()求父集-----")
number_set = number_set_a.issuperset(number_opp_set)
print(number_set)
_number_set = number_opp_set.issuperset(number_set_a)
print(_number_set)
print("-----第二种方式:用运算符 '>='求父集-----")
_number_set_ = number_set_a >= number_opp_set
print(_number_set_)
__number_set__ = number_opp_set >= number_set_a
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, 2, 3, 4, 5, 6, 7, 8, 9, 10}
{1, 3, 5, 7, 9}
-----第一种方式:issuperset()求父集-----
True
False
-----第二种方式:用运算符 '>='求父集-----
True
False

3.6 对称差集

  对称差集就是求两个集合中的剔除公共的部分的集合。

  例如,创建一个1到5的数字组成的集合,再创建一个0到10的奇数组成的集合,然后求其对称差集。

  代码:

 number_set_a =set(number for number in range(1,6))
print(number_set_a)
number_opp_set =set(number for number in range(1,11,2))
print(number_opp_set)
print("-----第一种方式:symmetric_difference()求对称差集-----")
number_set = number_set_a.symmetric_difference(number_opp_set)
print(number_set)
_number_set = number_opp_set.symmetric_difference(number_set_a)
print(_number_set)
print("-----第二种方式:用运算符 '^ '求对称差集-----")
_number_set_ = number_set_a ^ number_opp_set
print(_number_set_)
__number_set__ = number_opp_set ^ number_set_a
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, 2, 3, 4, 5}
{1, 3, 5, 7, 9}
-----第一种方式:symmetric_difference()求对称差集-----
{2, 4, 7, 9}
{2, 4, 7, 9}
-----第二种方式:用运算符 '^ '求对称差集-----
{2, 4, 7, 9}
{2, 4, 7, 9}

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

Python的集合的更多相关文章

  1. Python 3 集合基础和概念!

    Python 3 集合基础和概念! Python 3中,集合是无序的,所以不能进行切片和索引操作. 创建集合有两个方法:set()方法创建的集合是可变的,可被迭代的:frozenset()方法创建的集 ...

  2. Python 操作集合

    Python 操作集合 集合,set,主要用于数据的关系测试和去重处理,和列表类似,可以存储数据,列表中可以存储重复的数据,但是如果转化为集合之后,数据就会进行去重,然后保留唯一值:关系测试就是求多个 ...

  3. Python中集合set()的使用及处理

    在Python中集合(set)与字典(dict)比较相似,都具有无序以及元素不能重复的特点 1.创建set 创建set需要一个list或者tuple或者dict作为输入集合 重复的元素在set中会被自 ...

  4. Python:集合操作总结

    集合是一组无序排列的不重复元素集 [注]:集合的最大作用是对一个序列进行去重操作 一.集合的分类 在Python中集合分为两类,为可变集合(set)和不可变集合(frozenset).对于可变集合(s ...

  5. python 的集合 set()操作

      Python 的集合 set(),是一个无序不重复元素集,可以用于关系测试和消除重复元素.     有以下运算:   1.创建一个set ()集合:   2.add:增加集合元素   3.clea ...

  6. python set集合(16)

    在python变量中除了以前文章所提到的整形int / 浮点数float / 布尔值bool / 列表list / 字典dict 之外,还有一个类型我们还没有做详细介绍,这个变量类型就是集合set. ...

  7. python frozenset集合(17)

    在前一篇文章中我们对 python set集合 做了详细的讲解,而本文讲解的 frozenset集合 其实和set集合类似!区别在于frozenset集合不能修改/添加/删除,其他功能和set集合一样 ...

  8. Python数据类型--集合(set)

    Python的集合是无序.可迭代的容器对象,所有元素放在一对大括号中{},元素之间使用逗号隔开,同一集合内的元素具有唯一性,不允许重复. 集合中只能包含数字.字符串.元组等不可变类型的数据,不能包含列 ...

  9. [python]set集合学习

    python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和 ...

随机推荐

  1. poj 2486 Apple Tree(树形DP 状态方程有点难想)

    Apple Tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9808   Accepted: 3260 Descri ...

  2. 对比jquery获取属性的方法props、attr、data

    1.attr,prop 对于HTML元素本身就带有的固有属性,在处理时,使用prop方法.对于自定义的属性是取不到的: 对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法. 2.a ...

  3. backface-visibility 3D修复

    backface-visibility  是作用于 3D transform 时候   默认是   backface-visibility: hidden;   当一个元素3D变换的时候,会立即看到背 ...

  4. 介绍一款好用 mongodb 可视化工具

    最近想自己搭建一个个人博客,所以学了下mongodb,mongodb是用命令行输入的,有些人可能不太习惯,我自己找了下mongodb的一些可视化工具,一开始安装的是mongoVUE,mongoVUE页 ...

  5. Javascript判断数据类型与真假值隐形转换研究

    一.引言 我们在开发的时候经常要判断真和假,这是我们经常写的代码: if(a){ alert(1) } 那我们怎么判定a是真还是假呢?下面这些值的真假又是多少呢?它们的数据类型又是怎样的呢? &quo ...

  6. python模块导入的方法与区别

    import ..   #导入整个模块 from .. import .. #导入模块中的类.函数或者变量 from .. import *  #导入模块中的所有公开成员 from .. import ...

  7. python爬虫(一)_爬虫原理和数据抓取

    本篇将开始介绍Python原理,更多内容请参考:Python学习指南 为什么要做爬虫 著名的革命家.思想家.政治家.战略家.社会改革的主要领导人物马云曾经在2015年提到由IT转到DT,何谓DT,DT ...

  8. 使用dynamic特性处理XML文档

    处理XML文档是我们经常需要进行的一项工作,尤其是在进行网络服务相关编程时,比如更新RSS等.在.NET 3.5中引入了Linq To XML,使得XML文档的读写已经大大简化,而.NET 4.0中最 ...

  9. 基于 HTML5 WebGL 的 3D “弹力”布局

    分子力(molecular force),又称分子间作用力.范得瓦耳斯力,是指分子间的相互作用.当二分子相距较远时,主要表现为吸引力,这种力主要来源于一个分子被另一个分子随时间迅速变化的电偶极矩所极化 ...

  10. Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法

    找到Help Viewer程序的位置(可以使用Everything工具搜索microsoft help找到),发送到桌面快捷方式,打开此快捷方式的属性,在目标的最后添加下面那行字,然后即可通过快捷方式 ...