Python 程序设计入门(010)—— 集合的操作
目录
Python 中的集合(set)与数学中的集合概念类似,用于保存不重复的元素。有可变集合(set)和不可变集合(frozenset)两种。
在形式上,集合的所有元素放在一对大括号 {} 中,两个相邻元素之间使用逗号(,)分隔。
一、集合的特征
集合有如下特点:
(1)可以容纳多个数据;
(2)可以容纳不同类型的数据;
(3)数据是无序存储的(不支持下标索引);
(4)不允许重复数据存在;
(5)可以修改(增加或删除元素等)
(6)支持 for 循环。
集合和列表、元组、字符串等定义基本相同:
(1)列表使用中括号:[ ]
(2)元组使用小括号:( )
(3)字符串使用单引号或双引号:" "
(4)集合使用大括号:{ }
注意:集合是可修改的数据类型,但集合中的元素必须是不可修改的类型。即:集合中元素只能是数值、字符串、元组等。
二、创建集合
可以使用大括号 {} 或者 set() 函数创建集合。注意:创建一个空集合必须用 set() 而不是 {},因为 {} 是用来创建一个空字典。
1、使用 {} 创建集合
语法格式如下:
setname = {
element1, element2, ... , elementn}
说明:使用此方法不能创建空集合。
例如:
set1 = {
1,2,3,4,5}
set2 = {
"Tom","Jerry","John","Black"}
set3 = {
} # set3的类型为字典(dict)
print(set1)
print(set2)
print(type(set2))
print(set3)
print(type(set3))
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
1, 2, 3, 4, 5}
{
'Black', 'John', 'Jerry', 'Tom'}
<class 'set'>
{
}
<class 'dict'>
2、使用 set() 函数创建集合
使用 set() 函数可以创建空集合,也可以将列表、元组等其他可迭代对象转化为集合。set() 函数的语法格式如下:
set1 = set()
tuple1 = ("Tom","Jerry","John","Black")
list1 = [1,22,44,20,51]
set2 = set(tuple1)
set3 = set(list1)
print(set1)
print(type(set1))
print(set2)
print(type(set2))
print(set3)
print(type(set3))
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
set()
<class 'set'>
{
'Black', 'Jerry', 'Tom', 'John'}
<class 'set'>
{
1, 44, 51, 20, 22}
<class 'set'>
集合和列表非常相似 。两者的不同点如下:
(1)集合中只能存储不可变对象,因此集合的元素不能是列表或集合,但可以是元组。
例1:如下程序报错,原因是列表为可变序列。
set3 = {
[1,2],3}
print(set3)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
Traceback (most recent call last):
File "C:\Python\Python38\First.py", line 3, in <module>
set3 = {
[1,2],3}
TypeError: unhashable type: 'list'
例2:如下所示的程序,元组为不可变序列。
set3 = {
(1,2),3}
print(set3)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
3, (1, 2)}
例3:如下程序报错,原因是集合为可变序列。
set3 = {
{
1,2},3}
print(set3)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
Traceback (most recent call last):
File "C:\Python\Python38\First.py", line 1, in <module>
set3 = {
{
1,2},3}
TypeError: unhashable type: 'set'
例4:如下所示的程序,frozenset 为不可变序列。
set1 = frozenset({
1,2})
set2 = {
set1,3}
print(set1)
print(type(set1))
print(set2)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
frozenset({
1, 2})
<class 'frozenset'>
{
3, frozenset({
1, 2})}
(2)集合中存储的对象是无序的(不是按照元素的插入顺序保存),不支持索引与切片。
例如:
set1 = {
1,2,3,4,5}
print(set1[2])
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
Traceback (most recent call last):
File "C:\Python\Python38\First.py", line 2, in <module>
print(set1[2])
TypeError: 'set' object is not subscriptable
(3)集合中不能出现重复的元素,如果定义时出现重复的元组,则自动去重后保存。
例如:
set1 = {
1,1,2,2,3,3}
print(set1)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
1, 2, 3}
二、集合的修改
因为集合是无序的,所以集合不支持下标索引访问。但集合和列表一样,是允许修改的。集合支持以下几种形式的修改操作:
(1)添加新元素;
(2)移除元素;
(3)从集合中随机取出元素;
(4)清空集合;
(5)消除两个集合的差集;
(6)两个集合合并;
(7)统计集合元素数量。
1、向集合中添加新元素
(1)使用 add() 方法可以将指定元素,添加到集合内。语法格式如下:
setname.add(元素)
例如:
set1 = {
"Tom","Jerry","John","Black"}
set1.add("Rose")
print(set1)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
'Rose', 'Tom', 'Black', 'Jerry', 'John'}
(2)通过 update() 方法添加一个序列到当前集合。语法格式如下:
setname.update(序列)
例如:
set1 = {
"Tom","Jerry","John","Black","White","Rose"}
set2 = {
"Zhangsan","Lisi"}
print(set1)
print(set2)
set1.update(set2)
print(set1)
print(set2)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
'Tom', 'Rose', 'Black', 'John', 'Jerry', 'White'}
{
'Zhangsan', 'Lisi'}
{
'Zhangsan', 'Lisi', 'Tom', 'Rose', 'Black', 'John', 'Jerry', 'White'}
{
'Zhangsan', 'Lisi'}
2、删除元素
(1)方法 remove() 将指定元素从集合内删除。语法格式如下:
setname.remove(元素)
例如:
set1 = {
"Tom","Jerry","John","Black"}
set1.remove("John")
print(set1)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
'Black', 'Tom', 'Jerry'}
(2)使用 del 语句可以删除整个集合。语法格式如下:
del setname
例如:
set1 = {
"Tom","Jerry","John","Black","White","Rose"}
print(set1)
del set1
print(set1)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
'White', 'John', 'Tom', 'Rose', 'Black', 'Jerry'}
Traceback (most recent call last):
File "C:\Python\Python38\First.py", line 4, in <module>
print(set1)
NameError: name 'set1' is not defined
3、从集合中随机取出元素(同时从集合中删除该元素)
使用方法 pop() 可以从集合中取出第一个元素。同时集合本身被修改,元素被移除。pop() 方法的语法格式如下:
setname.pop()
例如:
set1 = {
"Tom","Jerry","John","Black","White","Rose"}
print(set1)
a=set1.pop()
print(a)
print(set1)
a=set1.pop()
print(a)
print(set1)
print(a)
a=set1.pop()
print(set1)
print(a)
a=set1.pop()
print(a)
print(set1)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
'White', 'Tom', 'Jerry', 'Black', 'Rose', 'John'}
White
{
'Tom', 'Jerry', 'Black', 'Rose', 'John'}
Tom
{
'Jerry', 'Black', 'Rose', 'John'}
Tom
{
'Black', 'Rose', 'John'}
Jerry
Black
{
'Rose', 'John'}
4、清空集合
方法 clear() 可以清空集合。语法格式如下:
setname.clear()
例如:
set1 = {
"Tom","Jerry","John","Black","White","Rose"}
print(set1)
set1.clear()
print(set1)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
'Jerry', 'White', 'Tom', 'John', 'Black', 'Rose'}
set()
5、删除两个集合的差集
对比集合1和集合2,在集合1内,删除和集合2相同的元素。集合1被修改,集合2不变。语法格式如下:
setname1.difference_update(setname2)
例如:
set1 = {
"Tom","Jerry","John","Black","White","Rose"}
set2 = {
"John","Ligang","White","Zhangjing"}
print(set1)
print(set2)
set1.difference_update(set2)
print(set1)
print(set2)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
'Tom', 'Jerry', 'White', 'Rose', 'John', 'Black'}
{
'Ligang', 'John', 'Zhangjing', 'White'}
{
'Tom', 'Jerry', 'Rose', 'Black'}
{
'Ligang', 'John', 'Zhangjing', 'White'}
6、合并两个集合
将集合1和集合2组合成新集合,集合1和集合2不变,语法格式如下:
setname1.union(setname2)
例如:
set1 = {
"Tom","Jerry","John","Black","White","Rose"}
set2 = {
"John","Ligang","White","Zhangjing"}
print(set1)
print(set2)
set3 = set1.union(set2)
print(set1)
print(set2)
print(set3)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
'John', 'Jerry', 'Black', 'White', 'Rose', 'Tom'}
{
'Ligang', 'John', 'White', 'Zhangjing'}
{
'John', 'Jerry', 'Black', 'White', 'Rose', 'Tom'}
{
'Ligang', 'John', 'White', 'Zhangjing'}
{
'John', 'Jerry', 'Black', 'Ligang', 'White', 'Rose', 'Tom', 'Zhangjing'}
三、集合的遍历
(1)集合不支持下标索引,但可以用 for 循环遍历集合中的元素。例如:
set1 = {
"Tom","Jerry","John","Black","White","Rose"}
for x in set1:print(x)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
Tom
John
White
Rose
Black
Jerry
(2)查找集合中是否存在某个元素
使用 in 和 not in 可以判断一个元素是否存在于一个集合中。格式如下:
element in setname
例如:
set1 = {
"Tom","Jerry","John","Black","White","Rose"}
print("Jerry" in set1)
print("JERRY" in set1)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
True
False
四、集合的并、交、差运算
集合的交运算使用【&】符号,集合的并运算使用【|】符号,集合的差运算使用【-】符号。这几种运算结果生成新的集合,对原有的集合不会造成任何影响。
1、集合的交运算
set1 = {
"Tom","Jerry","John","Black","White","Rose"}
set2 = {
"Jerry","ZhangMing","Black","LiuTao"}
set3 = set1 & set2
print(set1)
print(set2)
print(set3)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
'Tom', 'Black', 'Jerry', 'John', 'White', 'Rose'}
{
'Jerry', 'ZhangMing', 'LiuTao', 'Black'}
{
'Jerry', 'Black'}
2、集合的并运算
set1 = {
"Tom","Jerry","John","Black","White","Rose"}
set2 = {
"Jerry","ZhangMing","Black","LiuTao"}
set3 = set1 | set2
print(set1)
print(set2)
print(set3)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
'Tom', 'John', 'White', 'Jerry', 'Rose', 'Black'}
{
'Jerry', 'LiuTao', 'Black', 'ZhangMing'}
{
'LiuTao', 'Tom', 'White', 'John', 'ZhangMing', 'Jerry', 'Rose', 'Black'}
3、集合的差运算
set1 = {
"Tom","Jerry","John","Black","White","Rose"}
set2 = {
"Jerry","ZhangMing","Black","LiuTao"}
set3 = set1 - set2
set4 = set2 - set1
print(set1)
print(set2)
print(set3)
print(set4)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
'Jerry', 'John', 'Tom', 'Rose', 'Black', 'White'}
{
'Jerry', 'LiuTao', 'ZhangMing', 'Black'}
{
'Tom', 'Rose', 'John', 'White'}
{
'LiuTao', 'ZhangMing'}
4、使用方法进行集合的并、交、差运算
(1)集合的交运算
set1 = {
"Tom","Jerry","John","Black","White","Rose"}
set2 = {
"Jerry","ZhangMing","Black","LiuTao"}
set3 = set1.intersection(set2)
print("set1:",set1)
print("set2:",set2)
print("set3:",set3)
set1.intersection_update(set2)
print("set1:",set1)
print("set2:",set2)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
set1: {
'Jerry', 'Rose', 'Black', 'John', 'Tom', 'White'}
set2: {
'Black', 'Jerry', 'ZhangMing', 'LiuTao'}
set3: {
'Jerry', 'Black'}
set1: {
'Jerry', 'Black'}
set2: {
'Black', 'Jerry', 'ZhangMing', 'LiuTao'}
(2)集合的并运算
set1 = {
"Tom","Jerry","John","Black","White","Rose"}
set2 = {
"Jerry","ZhangMing","Black","LiuTao"}
set3 = set1.union(set2)
print("set1:",set1)
print("set2:",set2)
print("set3:",set3)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
set1: {
'Tom', 'Black', 'Jerry', 'White', 'Rose', 'John'}
set2: {
'Jerry', 'Black', 'LiuTao', 'ZhangMing'}
set3: {
'Tom', 'Black', 'Jerry', 'ZhangMing', 'LiuTao', 'White', 'Rose', 'John'}
(3)集合的差运算
set1 = {
"Tom","Jerry","John","Black","White","Rose"}
set2 = {
"Jerry","ZhangMing","Black","LiuTao"}
set3 = set1.difference(set2)
print("set1:",set1)
print("set2:",set2)
print("set3:",set3)
set1.difference_update(set2)
print("set1:",set1)
print("set2:",set2)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
set1: {
'Jerry', 'John', 'Tom', 'Rose', 'Black', 'White'}
set2: {
'Jerry', 'Black', 'ZhangMing', 'LiuTao'}
set3: {
'White', 'Tom', 'Rose', 'John'}
set1: {
'John', 'Tom', 'Rose', 'White'}
set2: {
'Jerry', 'Black', 'ZhangMing', 'LiuTao'}
五、冻结集合
冻结集合只是 Python 集合(set)对象的一个不可变版本。set 可以随时修改集合的元素,但冻结集合的元素在创建后保持不变。因此,冻结集可以用作字典中的键或另一个集合的元素。和集合一样,它不是有序的(元素不可以索引)。
冻结集合的作用:
(1)在集合的关系中,有集合的中的元素是另一个集合的情况,但是普通集合(set)本身是可变的,那么它的实例就不能放在另一个集合中(set中的元素必须是不可变类型)。
(2)冻结集合提供了不可变的集合的功能,当集合不可变时,它就满足了作为集合中的元素的要求,就可以放在另一个集合中了。
使用 frozenset() 函数返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。frozenset() 函数的语法格式如下:
frozenset([iterable])
说明:
(1)参数 iterable 是可选的,不传入时会创建一个空的冻结集合,传入时由 iterable 中的元素初始化。
(2)参数 iterable 是一个可迭代对象(比如列表、字典、元组、字符串等),将此对象转为一个冻结集合。
例如:
set1 = frozenset()
set2 = {
"Jerry","ZhangMing","Black","LiuTao"}
set3 = frozenset(set2)
set4 = frozenset([1,2,3,4])
print("set1:",set1)
print(type(set1))
print("set3:",set3)
print(type(set3))
print("set4:",set4)
print(type(set4))
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
set1: frozenset()
<class 'frozenset'>
set3: frozenset({
'LiuTao', 'Black', 'Jerry', 'ZhangMing'})
<class 'frozenset'>
set4: frozenset({
1, 2, 3, 4})
<class 'frozenset'>
冻结集合为一个不可变、无序对象,不对对其进行增加、修改、排序、下标切取等操作,但它也具有集合的一些特性,可以进行并、交、差等集合操作。
例如:
set1 = frozenset({
"Jerry","ZhangMing","Black","LiuTao"})
set2 = frozenset(["Tom","Jerry","Jack"])
set3 = set1 & set2
set4 = set1 | set2
set5 = set1 - set2
print("set1:",set1)
print(type(set1))
print("set2:",set2)
print(type(set2))
print("set3:",set3)
print(type(set3))
print("set4:",set4)
print(type(set4))
print("set5:",set5)
print(type(set5))
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
set1: frozenset({
'LiuTao', 'Black', 'Jerry', 'ZhangMing'})
<class 'frozenset'>
set2: frozenset({
'Tom', 'Jerry', 'Jack'})
<class 'frozenset'>
set3: frozenset({
'Jerry'})
<class 'frozenset'>
set4: frozenset({
'Tom', 'Jerry', 'ZhangMing', 'LiuTao', 'Black', 'Jack'})
<class 'frozenset'>
set5: frozenset({
'LiuTao', 'Black', 'ZhangMing'})
<class 'frozenset'>