Python 集合数据类型之一: set [学习 Python 必备基础知识][看此一篇就够了][创建set集合][访问set集合][删除set集合][增删set集合的元素][set集合间交并差运算]

您的“关注”和“点赞”,是信任,是认可,是支持,是动力......

如意见相佐,可留言。
本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新。

在这里插入图片描述

1 set 集合概述

目前有两种内置集合类型,setfrozenset(可参见博文《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 集合常用方法详解》

【文章其它地址】

微信公众号:码农阿杰

CSDN 博客

【参考资料】

Python 官网

Python 3.8.2 documentation

posted @ 2020-05-20 20:15  码农阿杰  阅读(5553)  评论(0编辑  收藏  举报