1. Python 的集合
1.1 集合的定义
在 Python 中,集合 set 是基本数据类型的一种集合类型,它有可变集合 (set()) 和不可变集合 (frozenset) 两种。Python 中的集合 set 类似列表,但每个元素都必须时独一无二的,无序的。
集合 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 中集合的作用主要是:去重,把一个列表变成集合,就自动去重;关系测试,测试两组数据之间的交集、差集、并集等关系。1.2 集合的操作
在 Python 中,集合 set 的常用操作包括:创建集合 set、集合 set 增加、集合 set 删除、集合的交集、集合的并集、集合的差集等。1.2.1 集合的创建
在 Python 中,集合的创建可以使用集合的工厂函数 set() 和 frozenset(),但是,set() 创建的集合时可变的,frozenset() 创建的集合时不可变的,其语法格式分别如下:
集合名 = set(集合值)
集合名 = frozenset(集合值)
(1)创建空集合
在 Python 中,当不指定集合的值时,使用工厂函数 set() 和 frozenset() 即可创建一个空集合。
例如,创建空集合。
代码:
- a =set()
- b = frozenset()
- print(a)
- print(b)
运行结果:
(2)用 set() 方法创建集合
- set()
- frozenset()
例如,用 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:
- number_opp_set = set(number
- for number in range(1, 11, 2)) print(number_opp_set)
说明:
因为 Python 是解释性语言,代码越少,解释花费的时间也少。运行结果 1:
例如,用 frozenset() 方法创建一个 0 到 10 之间的奇数的集合,并打印出来。
代码:
- number_opp_set_0 = frozenset(number
- for number in range(1, 11, 2)) print(number_opp_set_0)
运行结果:
1.2.2 集合的增加
- 1 frozenset({1, 3, 5, 7, 9})
在 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。
运行结果:
(2)update() 方法
- {1, 3, 5, 7, 9}
- {1, 2, 3, 5, 7, 9, 18}
集合 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('2')
- number_opp_set.update('18')
- print(number_opp_set)
说明:
第 3、4 行,分别调用 update() 方法分别向集团中增加偶数 2 和 18. 运行结果:
- {1, 3, 5, 7, 9}
- {1, 3, 5, 7, 9, '2', '8', '1'}
从以上的运行结果中可知,偶数 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('2')
- number_opp_set.update(['18'])
- number_opp_set.update({'19'})
- print(number_opp_set)
运行结果:
1.2.3 集合的删除
- {1, 3, 5, 7, 9}
- {1, 3, 5, 7, 9, '18', '2', '19'}
在 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() 方法。
例如,将 1.2.2 中增加到集合中的值删除。
代码:
- number_opp_set =set(number for number in range(1,11,2))
- print(number_opp_set)
- number_opp_set.update('2')
- number_opp_set.update(['18'])
- number_opp_set.update({'19'})
- print(number_opp_set)
- number_opp_set.remove('2')
- number_opp_set.remove('18')
- number_opp_set.remove('19')
- print(number_opp_set)
说明:
第 7、8、9 行,分别调用 remove() 方法分别从集合中删除前面增加到集合中的值,并且 remove 中的参数必须用引号引起来,否则 Python 解释器无法解析,会提示错误。运行结果:
1.2.3 集合的访问
- {1, 3, 5, 7, 9}
- {1, 3, 5, 7, '18', 9, '2', '19'}
- {1, 3, 5, 7, 9}
在 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 打印整个集合。运行结果:
在 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)
1.3 集合的关系测试
- {2, 4, 6, 8, 10}
- 2
- 4
- 6
- 8
- 10
在 Python 中,集合的关系测试包括:并集、交集、差集等等。
1.3.1 并集
集合中,并集也叫合集,即将一个集合和另一个集合合并为一个集合的过程。求并集使用函数 union()。
例如,创建一个 1 到 10 之间的数字组成的偶数的集合和奇数集合,然后求其并集。
代码:
- number_opp_set =set(number for number in range(1,11,2))
- print(number_opp_set)
- number_even_set =set(number for number in range(2,11,2))
- print(number_even_set)
- number_set = number_opp_set.union(number_even_set)
- print(number_set)
说明:
第 5 行,用函数 union() 将集合 number_opp_set 和集合 number_even_set 合并后赋值给变量 number_set。
运行结果:
- {1, 3, 5, 7, 9}
- {2, 4, 6, 8, 10}
- {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
从以上的运行结果可知,通过函数 union() 将两个集合合并为一个集合。1.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)
- number_set = number_set_a.intersection(number_opp_set)
- print(number_set)
说明:
第 5 行,使用函数 intersection() 求集合 number_set_a 和集合 number_opp_set 的交集。运行结果:
- {1, 2, 3, 4, 5}
- {1, 3, 5, 7, 9}
- {1, 3, 5}
从以上的运行结果可知,通过函数 intersection() 已经把两个集合的公共部分求出来了。1.3.3 差集
差集就是在两个集合中,在集合 a 中有,但集合 b 中没有的部分,或者集合 b 中有,但集合 a 中没有的部分。
例如,创建一个 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)
- number_set = number_set_a.difference(number_opp_set)
- print(number_set)
- _number_set = number_opp_set.difference(number_set_a)
- print(_number_set)
说明:
第 5 行,使用函数 difference() 求集合 number_set_a 中有,但集合 number_opp_set 中没有的部分,并赋值给变量 number_set。
第 7 行,使用函数 difference() 求集合 number_opp_set 中有,但集合 number_set_a 中没有的部分,并赋值给变量_number_set。运行结果:
1.3.4 子集
- {1, 2, 3, 4, 5}
- {1, 3, 5, 7, 9}
- {2, 4}
- {9, 7}
判断集合 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)
- number_set = number_set_a.issubset(number_opp_set)
- print(number_set)
- _number_set = number_opp_set.issubset(number_set_a)
- print(_number_set)
说明:
第 5 行,判断集合 number_set_a 是否是集合 number_opp_set 的子集,判断结果赋值给变量 number_set。
第 7 行,判断集合 number_opp_set 是否是集合 number_set_a 的子集,判断结果赋值给变量_number_set。运行结果:
1.3.5 父集
- {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
- {1, 3, 5, 7, 9}
- False
- True
判断集合 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)
- number_set = number_set_a.issuperset(number_opp_set)
- print(number_set)
- _number_set = number_opp_set.issuperset(number_set_a)
- print(_number_set)
说明:
第 5 行,判断集合 number_set_a 是否是集合 number_opp_set 的父集,判断结果赋值给变量 number_set。
第 7 行,判断集合 number_opp_set 是否是集合 number_set_a 的父集,判断结果赋值给变量_number_set。运行结果:
1.3.5 对称差集
- {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
- {1, 3, 5, 7, 9}
- True
- False
对称差集就是求两个集合中的剔除公共的部分的集合。
例如,创建一个 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)
- 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)
说明:
第 5 行,使用函数 symmetric_difference() 求集合 number_set_a 和集合 number_opp_set 的对称差集,并赋值给变量 number_set。
第 7 行,使用函数 symmetric_difference() 求集合 number_opp_set 和集合 number_set_a 的对称差集,并赋值给变量_number_set。
运行结果:
- {1, 2, 3, 4, 5}
- {1, 3, 5, 7, 9}
- {2, 4, 7, 9}
- {2, 4, 7, 9}
从以上的运行结果可知,求两个集合的对称差集时,哪个集合写在函数中都行,其结果都一样。
来源: http://www.cnblogs.com/qtyun/p/8052079.html