Python 集合数据类型之一: set [学习 Python 必备基础知识][看此一篇就够了][创建set集合][访问set集合][删除set集合][增删set集合的元素][set集合间交并差运算]
您的“关注”和“点赞”,是信任,是认可,是支持,是动力......
如意见相佐,可留言。
本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新。
1 set 集合概述
目前有两种内置集合类型,set
和 frozenset
(可参见博文《Python 集合数据类型之二: fronzenset》)。
-
set
类型:是可变的,其内容可以使用add()
和remove()
这样的方法来改变。
由于是可变类型,它没有哈希值,且不能被用作字典的键
或其他集合的元素
。 -
frozenset
类型:是不可变并且为hashable
,其内容在被创建后不能再改变;
因此它可以被用作字典的键
或其他集合的元素
。
Python 中的 set
集合,将所有元素放在一对大括号 {}
中,相邻元素之间用 ,
分隔。
set 集合是无序的,所以每次输出时元素的排序顺序可能都不相同。
set 集合中的元素都是唯一的,互不相同。并且元素个数没有限制。
在同一集合中,只能存储不可变的数据类型,包括数字、字符串、元组;无法存储列表、set 集合、字典这些可变的数据类型,否则 Python 解释器会抛出 TypeError
错误。
举例如下所示:
例一,在同一集合中,只能存储不可变的数据类型,包括数字、字符串、元组。
set_demo1 = {11, 2.1, True, 4 + 5j, '码农阿杰', (1, 2, 3)} # 可以存储整数、浮点数、布尔值、复数、字符串、元组
print(type(set_demo1))
运行结果:
<class 'set'>
在同一集合中,无法存储列表、set 集合、字典这些可变的数据类型,否则 Python 解释器会抛出 TypeError
错误。
例二,无法存储列表
set_demo2 = {[1, 2, 3, 4]} # 无法存储列表
print(type(set_demo2))
运行结果:
set_demo2 = {[1, 2, 3, 4]} # 无法存储列表
TypeError: unhashable type: 'list'
例三,无法存储 set 集合
set_demo3 = {{1, 2, 3, 4}} # 无法存储 set 集合
print(type(set_demo3))
运行结果:
set_demo3 = {{1, 2, 3, 4}} # 无法存储 set 集合
TypeError: unhashable type: 'set'
例四,无法存储字典
set_demo4 = {{'Q': 'python', 'W': 'java'}} # 无法存储字典
print(type(set_demo4))
运行结果:
set_demo4 = {{'Q': 'python', 'W': 'java'}} # 无法存储字典
TypeError: unhashable type: 'dict'
在同一集合中,数据必须保证是唯一的,因为集合对于每种数据元素,只会保留一份。
例五,set
集合中的元素都是唯一的,互不相同。
set_demo1 = {11, 2.1, 11, True, 4 + 5j, '码农阿杰', (1, 2, 3), '码农阿杰'}
print(set_demo1)
运行结果:
{True, 2.1, 11, (1, 2, 3), '码农阿杰', (4+5j)}
2 Python 创建 set 集合
2.1 使用 {}
创建
直接使用 {}
创建 set 集合,并把创建好的 set 集合赋值给一个变量,便于以后的使用。
语法格式如下所示:
setname = {element1, element2, ..., elementn}
对以上格式说明,
set
:表示集合的名称。起名时既要符合 Python 命名规范,也要避免与 Python 内置函数重名。同时要“见名知其意”。element1 - elementn
:表示 set 集合元素,个数没有限制。
举例如下所示:
set_demo = {'微信公众号:', '码农阿杰'}
print(type(set_demo))
print(set_demo)
运行结果:
<class 'set'>
{'微信公众号:', '码农阿杰'}
2.2 使用 set() 函数创建集合
使用 Python 的内置函数 set()
创建集合。
其实是将字符串、列表、元组、range 对象等可迭代对象转换成 set 集合。
注意:如果要创建空集合,只能使用 set() 函数实现。因为直接使用一对 {}
创建 set 集合,Python 解释器会将其视为一个空字典。
使用语法格式如下所示:
setname = set(iteration)
对以上格式说明,
iteration
:表示字符串、列表、元组、range 对象等可迭代对象。
举例如下所示:
例一,
print(set('码农阿杰'))
print(set([1, 2, 3, 4, 5]))
print(set((1, 2, 3, 4, 5)))
print(set(range(1, 6)))
运行结果:
{'码', '阿', '农', '杰'}
{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}
例二,如果要创建空集合,只能使用 set() 函数实现。因为直接使用一对 {}
创建 set 集合,Python 解释器会将其视为一个空字典。
set_demo1 = {}
set_demo2 = set()
print(type(set_demo1))
print(type(set_demo2))
运行结果:
<class 'dict'>
<class 'set'>
3 Python 访问 set 集合元素
set 集合中的元素是无序的,因此无法使用索引(下标)访问元素。
在 Python 中,访问 set 集合元素,通常使用循环结构(请参见博文《Python 循环结构详解》),将集合中的数据(元素)逐一读取出来。
举例如下所示:
set_demo1 = {11, 2.1, True, 4 + 5j, '码农阿杰', (1, 2, 3)}
for i in set_demo1:
print(i)
运行结果:
True
2.1
11
(1, 2, 3)
(4+5j)
码农阿杰
4 Python 删除 set 集合
手动删除 set 集合,可以使用 del
关键字。
举例如下所示:
set_demo1 = {11, 2.1, True, 4 + 5j, '码农阿杰', (1, 2, 3)}
print('删除前 set_demo1 = ', set_demo1)
del set_demo1 # 使用 del 删除 set 集合
print('删除后 set_demo1 = ', set_demo1)
运行结果:
删除前 set_demo1 = {True, 2.1, 11, (1, 2, 3), '码农阿杰', (4+5j)}
Traceback (most recent call last):
File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 18, in <module>
print('删除后 set_demo1 = ', set_demo1)
NameError: name 'set_demo1' is not defined
5 对 set 集合中元素的操作
5.1 向 set 集合中添加元素
向 set 集合中添加元素,可以使用 set
类型提供的 add()
方法实现。
注意:使用 add()
方法添加的元素,只能是不可变数据,包含数字、字符串、元组;不能添加列表、集合、字典这类可变的数据,否则 Python 解释器会报 TypeError
错误。
使用语法格式如下所示:
setname.add(element)
对以上格式说明,
setname
:表示要添加元素的 set 集合。element
:表示要添加到 set 集合中的元素。
举例如下所示:
例一,向 set 集合中添加的元素为字符串
set_demo1 = {11, 2.1, True, 4 + 5j, '码农阿杰', (1, 2, 3)}
print('添加前 set_demo1 =', set_demo1)
set_demo1.add('https://blog.csdn.net/manongajie') # 向 set 集合中添加元素
print('添加后 set_demo1 =', set_demo1)
运行结果:
添加前 set_demo1 = {True, 2.1, 11, (1, 2, 3), '码农阿杰', (4+5j)}
添加后 set_demo1 = {True, 2.1, 'https://blog.csdn.net/manongajie', 11, (1, 2, 3), '码农阿杰', (4+5j)}
例二,向 set 集合中添加的元素为列表
set_demo1 = {11, 2.1, True, 4 + 5j, '码农阿杰', (1, 2, 3)}
print('添加前 set_demo1 =', set_demo1)
set_demo1.add([1, 2, 3, 4])
print('添加后 set_demo1 =', set_demo1)
运行结果:
添加前 set_demo1 = {True, 2.1, 11, (1, 2, 3), (4+5j), '码农阿杰'}
Traceback (most recent call last):
File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 15, in <module>
set_demo1.add([1, 2, 3, 4])
TypeError: unhashable type: 'list'
5.2 从 set 集合中删除元素
删除 set 集合中的指定元素,可以使用 remove()
方法。
注意:如果要删除的元素不在集合中,则此方法会抛出 KeyError
错误。此时,可以使用 discard()
方法,此方法和 remove()
方法的用法完全相同,唯一的区别在于当删除集合中元素失败时,此方法不会抛出任何错误。
使用语法格式如下所示:
setname.remove(element)
对以上格式说明,
setname
:要删除元素的 set 集合。element
:表示要删除的元素。
举例如下所示:
例一,
set_demo1 = {11, 2.1, True, 4 + 5j, '码农阿杰', (1, 2, 3)}
print('删除前 set_demo1 =', set_demo1)
set_demo1.remove(11)
print('删除后 set_demo1 =', set_demo1)
运行结果:
删除前 set_demo1 = {True, 2.1, 11, (1, 2, 3), '码农阿杰', (4+5j)}
删除后 set_demo1 = {True, 2.1, (1, 2, 3), '码农阿杰', (4+5j)}
例二,使用 remove()
方法删除 set 集合中不存在的元素,会报错
set_demo1 = {11, 2.1, True, 4 + 5j, '码农阿杰', (1, 2, 3)}
print('删除前 set_demo1 =', set_demo1)
set_demo1.remove('阿杰')
print('删除后 set_demo1 =', set_demo1)
运行结果:
删除前 set_demo1 = {True, 2.1, 11, (1, 2, 3), '码农阿杰', (4+5j)}
Traceback (most recent call last):
File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 15, in <module>
set_demo1.remove('阿杰')
KeyError: '阿杰'
例三,使用 discard()
方法删除 set 集合中不存在的元素,不会报错
set_demo1 = {11, 2.1, True, 4 + 5j, '码农阿杰', (1, 2, 3)}
print('删除前 set_demo1 =', set_demo1)
set_demo1.discard('阿杰')
print('删除后 set_demo1 =', set_demo1)
运行结果:
删除前 set_demo1 = {True, 2.1, 11, (1, 2, 3), (4+5j), '码农阿杰'}
删除后 set_demo1 = {True, 2.1, 11, (1, 2, 3), (4+5j), '码农阿杰'}
6 Python set 集合之间的运算
6.1 交集运算
set 集合间的交集运算:取两集合公共的元素。
运算符位:&
。
举例如下所示:
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
print(set1 & set2)
运行结果:
{4, 5}
6.2 并集运算
set 集合间的并集运算:取两集合全部的元素。
运算符位:|
。
举例如下所示:
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
print(set1 | set2)
运行结果:
{1, 2, 3, 4, 5, 6, 7, 8}
6.3 差集运算
set 集合间的差集运算:取一个集合(被减数集合)中另一个集合没有的元素。
运算符位:-
。
举例如下所示:
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
print('set1 - set2 =', set1 - set2)
print('set2 - set1 =', set2 - set1)
运行结果:
set1 - set2 = {1, 2, 3}
set2 - set1 = {8, 6, 7}
6.4 对称差集运算
set 集合间的对称差集运算:取集合 A 和 B 中不属于 A&B
的元素。
运算符位:^
。
举例如下所示:
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
print(set1 ^ set2)
运行结果:
{1, 2, 3, 6, 7, 8}
7 set 集合常用方法
请参见博文 《Python set 集合常用方法详解》。