【Python】set集合详解

矫情吗;* 2022-10-12 01:02 302阅读 0赞

set集合详解

  • 概述
  • 创建 set集合(2种)
    • 1) 使用 {} 创建
    • 2) set()函数创建集合
  • 访问set集合元素
  • 删除set集合
  • set集合中添加元素
  • set集合中删除元素
  • set集合做交集、并集、差集运算
  • set集合方法详解

概述

Python 中的集合,和数学中的集合概念一样,用来保存不重复的元素,即集合中的元素都是唯一的,互不相同。

从形式上看,和字典类似,Python 集合会将所有元素放在一对大括号 {} 中,相邻元素之间用“,”分隔,如下所示:

  1. {
  2. element1, element2, ..., elementn}

其中,elementn 表示集合中的元素,个数没有限制。

同一集合中,只能存储不可变的数据类型,包括整形、浮点型、字符串、元组,无法存储列表、字典、集合这些可变的数据类型,否则 Python 解释器会抛出 TypeError 错误。比如说:

  1. >>> {
  2. {
  3. 'a':1}}
  4. Traceback (most recent call last):
  5. File "<pyshell#8>", line 1, in <module>
  6. {
  7. {
  8. 'a':1}}
  9. TypeError: unhashable type: 'dict'
  10. >>> {
  11. [1,2,3]}
  12. Traceback (most recent call last):
  13. File "<pyshell#9>", line 1, in <module>
  14. {
  15. [1,2,3]}
  16. TypeError: unhashable type: 'list'
  17. >>> {
  18. {
  19. 1,2,3}}
  20. Traceback (most recent call last):
  21. File "<pyshell#10>", line 1, in <module>
  22. {
  23. {
  24. 1,2,3}}
  25. TypeError: unhashable type: 'set'

并且需要注意的是,数据必须保证是唯一的,因为集合对于每种数据元素,只会保留一份。例如:

  1. >>> {
  2. 1,2,1,(1,2,3),'c','c'}
  3. {
  4. 1, 2, 'c', (1, 2, 3)}

由于 Python 中的 set 集合是无序的,所以每次输出时元素的排序顺序可能都不相同。

其实,Python 中有两种集合类型,一种是 set 类型的集合,另一种是 frozenset 类型的集合,它们唯一的区别是,set 类型集合可以做添加、删除元素的操作,而 forzenset 类型集合不行。

创建 set集合(2种)

Python 提供了 2 种创建 set 集合的方法,分别是使用 {} 创建和使用 set() 函数将列表、元组等类型数据转换为集合

1) 使用 {} 创建

在 Python 中,创建 set 集合可以像列表、元素和字典一样,直接将集合赋值给变量,从而实现创建集合的目的,其语法格式如下:

  1. setname = {
  2. element1,element2,...,elementn}

其中,setname 表示集合的名称,起名时既要符合 Python 命名规范,也要避免与 Python 内置函数重名。

举个例子:

  1. a = {
  2. 1,'c',1,(1,2,3),'c'}
  3. print(a)
  4. 输出:{
  5. 1, 'c', (1, 2, 3)}

2) set()函数创建集合

set() 函数为 Python 的内置函数,其功能是将字符串、列表、元组、range 对象等可迭代对象转换成集合。该函数的语法格式如下:

  1. setname = set(iteration)

其中,iteration 就表示字符串、列表、元组、range 对象等数据。

例如:

  1. set1 = set("c.biancheng.net")
  2. set2 = set([1,2,3,4,5])
  3. set3 = set((1,2,3,4,5))
  4. print("set1:",set1)
  5. print("set2:",set2)
  6. print("set3:",set3)
  7. 输出:
  8. set1: {
  9. 'a', 'g', 'b', 'c', 'n', 'h', '.', 't', 'i', 'e'}
  10. set2: {
  11. 1, 2, 3, 4, 5}
  12. set3: {
  13. 1, 2, 3, 4, 5}

注意,如果要创建空集合,只能使用 set() 函数实现。因为直接使用一对 {},Python 解释器会将其视为一个空字典。

访问set集合元素

由于集合中的元素是无序的,因此无法向列表那样使用下标访问元素。

Python 中,访问集合元素最常用的方法是使用循环结构,将集合中的数据逐一读取出来。

例如:

  1. a = {
  2. 1, 'c', 1, (1, 2, 3), 'c'}
  3. for ele in a:
  4. print(ele, end=' ')
  5. 输出:c 1 (1, 2, 3)

删除set集合

和其他序列类型一样,手动函数集合类型,也可以使用 del() 语句,例如:

  1. a = {
  2. 1,'c',1,(1,2,3),'c'}
  3. print(a)
  4. del(a)
  5. print(a)
  6. 输出:
  7. {
  8. 1, 'c', (1, 2, 3)}
  9. Traceback (most recent call last):
  10. File "C:\Users\mengma\Desktop\1.py", line 4, in <module>
  11. print(a)
  12. NameError: name 'a' is not defined

Python set 集合最常用的操作是向集合中添加、删除元素,以及集合之间做交集、并集、差集等运算

set集合中添加元素

set 集合中添加元素,可以使用 set 类型提供的 add() 方法实现,该方法的语法格式为:

  1. setname.add(element)

其中,setname 表示要添加元素的集合,element 表示要添加的元素内容。

需要注意的是,使用 add() 方法添加的元素,只能是数字、字符串、元组或者布尔类型(True 和 False)值,不能添加列表、字典、集合这类可变的数据,否则 Python 解释器会报 TypeError 错误。例如:

  1. a = {
  2. 1,2,3}
  3. a.add((1,2))
  4. print(a)
  5. a.add([1,2])
  6. print(a)
  7. 输出:
  8. {
  9. (1, 2), 1, 2, 3}
  10. Traceback (most recent call last):
  11. File "C:\Users\qinjl\Desktop\1.py", line 4, in <module>
  12. a.add([1,2])
  13. TypeError: unhashable type: 'list'

set集合中删除元素

删除现有 set 集合中的指定元素,可以使用 remove() 方法,该方法的语法格式如下:

  1. setname.remove(element)

使用此方法删除集合中元素,需要注意的是,如果被删除元素本就不包含在集合中,则此方法会抛出 KeyError 错误,例如:

  1. a = {
  2. 1,2,3}
  3. a.remove(1)
  4. print(a)
  5. a.remove(1)
  6. print(a)
  7. 输出:
  8. {
  9. 2, 3}
  10. Traceback (most recent call last):
  11. File "C:\Users\qinjl\Desktop\1.py", line 4, in <module>
  12. a.remove(1)
  13. KeyError: 1

如果我们不想在删除失败时令解释器提示 KeyError 错误,还可以使用 discard() 方法,此方法和 remove() 方法的用法完全相同,唯一的区别就是,当删除集合中元素失败时,此方法不会抛出任何错误。

  1. a = {
  2. 1,2,3}
  3. a.remove(1)
  4. print(a)
  5. a.discard(1)
  6. print(a)
  7. 输出:
  8. {
  9. 2, 3}
  10. {
  11. 2, 3}

set集合做交集、并集、差集运算

集合最常做的操作就是进行交集、并集、差集以及对称差集运算,首先有必要给大家普及一下各个运算的含义。
在这里插入图片描述
图中,有 2 个集合,分别为 set1={1,2,3}set2={3,4,5},它们既有相同的元素,也有不同的元素。以这两个集合为例,分别做不同运算的结果如下表所示。




































运算操作 Python运算符 含义 例子
交集 & 取两集合公共的元素 >>> set1 & set2
{3}
并集 | 取两集合全部的元素 >>> set1 | set2
{1,2,3,4,5}
差集 - 取一个集合中另一集合没有的元素 >>> set1 - set2
{1,2}
>>> set2 - set1
{4,5}
对称差集 ^ 取集合 AB 中不属于 A&B 的元素 >>> set1 ^ set2
{1,2,4,5}

set集合方法详解

  1. >>> dir(set)
  2. ['add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']
Python set方法














































































































方法名 语法格式 功能 实例
add() set1.add() 向 set1 集合中添加数字、字符串、元组或者布尔类型 >>> set1 = {1,2,3}
>>> set1.add((1,2))
>>> set1
{(1, 2), 1, 2, 3}
clear() set1.clear() 清空 set1 集合中所有元素 >>> set1 = {1,2,3}
>>> set1.clear()
>>> set1
set()

set()才表示空集合,{}表示的是空字典
copy() set2 = set1.copy() 拷贝 set1 集合给 set2 >>> set1 = {1,2,3}
>>> set2 = set1.copy()
>>> set1.add(4)
>>> set1
{1, 2, 3, 4}
>>> set1
{1, 2, 3}
difference()  set3 = set1.difference(set2) 将 set1 中有而 set2 没有的元素给 set3 >>> set1 = {1,2,3}
>>> set2 = {3,4}
>>> set3 = set1.difference(set2)
>>> set3
{1, 2}
difference_update() set1.difference_update(set2) 从 set1 中删除与 set2 相同的元素 >>> set1 = {1,2,3}
>>> set2 = {3,4}
>>> set1.difference_update(set2)
>>> set1
{1, 2}
discard() set1.discard(elem) 删除 set1 中的 elem 元素 >>> set1 = {1,2,3}
>>> set1.discard(2)
>>> set1
{1, 3}
>>> set1.discard(4)
{1, 3}
intersection() set3 = set1.intersection(set2) 取 set1 和 set2 的交集给 set3 >>> set1 = {1,2,3}
>>> set2 = {3,4}
>>> set3 = set1.intersection(set2)
>>> set3
{3}
intersection_update() set1.intersection_update(set2) 取 set1和 set2 的交集,并更新给 set1 >>> set1 = {1,2,3}
>>> set2 = {3,4}
>>> set1.intersection_update(set2)
>>> set1
{3}
isdisjoint() set1.isdisjoint(set2) 判断 set1 和 set2 是否没有交集,有交集返回 False;没有交集返回 True >>> set1 = {1,2,3}
>>> set2 = {3,4}
>>> set1.isdisjoint(set2)
False
issubset() set1.issubset(set2) 判断 set1 是否是 set2 的子集 >>> set1 = {1,2,3}
>>> set2 = {1,2}
>>> set1.issubset(set2)
False
issuperset() set1.issuperset(set2) 判断 set2 是否是 set1 的子集 >>> set1 = {1,2,3}
>>> set2 = {1,2}
>>> set1.issuperset(set2)
True
pop() a = set1.pop() 取 set1 中一个元素,并赋值给 a >>> set1 = {1,2,3}
>>> a = set1.pop()
>>> set1
{2,3}
>>> a
1
remove() set1.remove(elem) 移除 set1 中的 elem 元素 >>> set1 = {1,2,3}
>>> set1.remove(2)
>>> set1
{1, 3}
>>> set1.remove(4)
Traceback (most recent call last):
  File “<pyshell#90>”, line 1, in <module>
    set1.remove(4)
KeyError: 4
symmetric_difference() set3 = set1.symmetric_difference(set2) 取 set1 和 set2 中互不相同的元素,给 set3 >>> set1 = {1,2,3}
>>> set2 = {3,4}
>>> set3 = set1.symmetric_difference(set2)
>>> set3
{1, 2, 4}
symmetric_difference_update() set1.symmetric_difference_update(set2) 取 set1 和 set2 中互不相同的元素,并更新给 set1 >>> set1 = {1,2,3}
>>> set2 = {3,4}
>>> set1.symmetric_difference_update(set2)
>>> set1
{1, 2, 4}
union() set3 = set1.union(set2) 取 set1 和 set2 的并集,赋给 set3 >>> set1 = {1,2,3}
>>> set2 = {3,4}
>>> set3=set1.union(set2)
>>> set3
{1, 2, 3, 4}
update() set1.update(elem) 添加列表或集合中的元素到 set1 >>> set1 = {1,2,3}
>>> set1.update([3,4])
>>> set1
{1,2,3,4}

发表评论

表情:
评论列表 (有 0 条评论,302人围观)

还没有评论,来说两句吧...

相关阅读

    相关 集合:Map详解.

    目录: > 一、Map接口常用方法 > > 二、遍历Map集合的两种方式【重点】 > > 三、哈希表数据结构 > > 四、属性类:Properties类 > >

    相关 集合:Collection详解.

    目录: > 一、集合概述 > 二、集合继承关系图【图重点 要会看源码 背会】 > 三、Collection接口常用方法 > 四、关于集合的迭代/遍历【重点】

    相关 Java 集合详解

    1 集合的概念 Java集合类存放在Java.util包中,用来存放对象的容器。需要注意:集合只能存放对象;存放的是对象的引用,对象本身还是存放在堆内存中;可以存放多种数据

    相关 Java集合详解

    一、数组和集合的比较 数组不是面向对象的,存在明显的缺陷,集合弥补了数组的缺点,比数组更灵活更实用,而且不同的集合框架类可适用不同场合。如下: 1. 数组能存放基本数