微信公众号:码农充电站pro

个人主页:https://codeshellme.github.io

如果代码和注释不一致,那很可能两者都错了。

—— Norm Schryer

目录

前几节我们已经介绍了Python 中的列表list元组tuple字典dict,本节来介绍Python 中的最后一种数据结构——集合set

>>> set
<type 'set'>

1,Python 集合

Python 中的setdict 很像,唯一的不同是,dict 中保存的是键值对,而set 中只保存,没有

Python 集合有如下特点:

  • 集合中的元素是唯一的,不重复
  • 集合中的元素是无序
  • 集合中的元素可以是任意一种不可变类型,比如字符串数字元组
  • 集合中的元素可以动态的增加/删除
  • Python 会在需要的时候自动的扩容缩容集合,方便开发者使用

2,声明集合

Python 集合的声明有两种方式:

  • 使用set() 创建集合,() 中可为空,也可以是任意的可迭代类型,比如列表元组字典
  • 使用大括号{}创建集合,从该创建方式上也能看出集合字典很像

创建空集合时,只能用set(),而不能用{}

>>> s = set()  # 空集合
>>> s
set()
>>> s = {} # 空的 {} 会被解析成字典
>>> s
{}

创建非空集合时,可以用set(),也可以用{}

>>> s = {1, 'abc', 1.5}       # 用 {} 创建集合
>>> s
{1, 'abc', 1.5}
>>> s = set([1, 'abc', 1.5]) # 用列表创建集合
>>> s
{1, 'abc', 1.5}
>>> s = set((1, 'abc', 1.5)) # 用元组创建集合
>>> s
{1, 'abc', 1.5}
>>> s = set({'a':1, 'b':2, 'c':3}) # 用字典创建集合
>>> s # 只会包含字典中的键
{'c', 'b', 'a'}

由于集合中的元素是唯一的,如果初始化时的可迭代数据中有重复的元素,则会自动删去重复的元素:

>>> s = set([1, 2, 2, 3])  # 列表中有两个 2
>>> s # 集合中只有一个 2
{1, 2, 3}

3,集合元素个数

使用len() 函数可以查看集合中元素的个数:

>>> s = set([1, 'abc', 1.5])
>>> s
{1, 'abc', 1.5}
>>> len(s) # 元素个数
3

4,访问集合元素

由于Python 集合中的元素的是无序的,所以可不能使用下标 的方式来访问集合中的单个元素。

我们可以使用for 循环 来遍历集合中的所有元素:

>>> s = set([1, 'abc', 1.5])
>>> for i in s:
... print(i)
...
1
abc
1.5

5,集合运算

我们可以对两个集合进行如下运算:

  • & 运算:计算集合的交集
  • | 运算:计算集合的并集
  • in 运算:判断某个元素是否在集合中

交集与并集

>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2 # 交集
{2, 3}
>>> s1 | s2 # 并集
{1, 2, 3, 4}

in 运算

>>> s = set([1 , 2, 3])
>>> 1 in s
True
>>> 2 not in s
False

6,集合函数

使用dir(set) 查看集合支持的所有方法:

>>> dir(set)
['__and__', '__class__', '__contains__',
'__delattr__', '__dir__', '__doc__',
'__eq__', '__format__', '__ge__',
'__getattribute__', '__gt__', '__hash__',
'__iand__', '__init__',
'__init_subclass__', '__ior__',
'__isub__', '__iter__', '__ixor__',
'__le__', '__len__', '__lt__', '__ne__',
'__new__', '__or__', '__rand__',
'__reduce__', '__reduce_ex__',
'__repr__', '__ror__', '__rsub__',
'__rxor__', '__setattr__', '__sizeof__',
'__str__', '__sub__', '__subclasshook__',
'__xor__',
'add', 'clear', 'copy', 'difference',
'difference_update', 'discard',
'intersection', 'intersection_update',
'isdisjoint', 'issubset', 'issuperset',
'pop', 'remove', 'symmetric_difference',
'symmetric_difference_update', 'union',
'update']

下面一一介绍这些非魔法方法,共17 个。

1.add 方法

作用:向集合S 中添加元素

原型:S.add(...) -> None

参数:任意不可变类型数据

返回值: 总是返回 None

由于集合中的元素是唯一的,向集合中添加元素时有两种情况:

  • 添加的元素集合中不存在:只要元素类型合法,就会成功添加进去
  • 添加的元素集合中已存在:不会对集合进行任何操作

示例:

>>> s = set([1, 3, 5]) # 初始化一个集合
>>> s
{1, 3, 5}
>>> s.add(7) # 向集合中添加一个不存在的元素
>>> s
{1, 3, 5, 7}
>>> s.add(5) # 向集合中添加一个已存在的元素
>>> s
{1, 3, 5, 7}

2.remove 方法

作用:删除集合S 中的元素

原型:S.remove(...) -> None

参数:任意不可变类型数据

返回值:当要删除的元素存在时,返回None,否则,抛出异常

示例:

>>> s = set([1, 3, 5])
>>> s
{1, 3, 5}
>>> s.remove(3) # 元素 3 存在
>>> s # 成功删除
{1, 5}
>>> s.remove(3) # 元素 3,已不存在
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 3 # 抛出异常

3.discard 方法

作用:用于删除集合S 中的元素,与remove 方法的不同是,如果元素不存在,不会抛出异常

原型:S.discard(...) -> None

参数:任意不可变类型数据

返回值:总是返回None

示例:

>>> s = set([1, 3, 5, 6])
>>> s.discard(3) # 删除一个已存在的元素
>>> s
{1, 5, 6}
>>> s.discard(7) # 删除一个不存在的元素
>>> s
{1, 5, 6}

4.pop 方法

作用:随机删除并返回集合S 中的一个元素

原型:S.pop() -> item

参数:无

返回值:被删除的元素,如果集合为空,抛出异常

示例:

>>> s = set([3, 5, 1])
>>> s.pop() # 删除并返回 1
1
>>> s.pop() # 删除并返回 3
3
>>> s.pop() # 删除并返回 5
5
>>> s # 集合为空
set()
>>> s.pop() # 抛出异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'pop from an empty set'

5.union 方法

作用:用于合并多个集合,相当于多个集合做并集运算

原型:set.union(...) -> set

参数:任意多个可迭代类型数据

返回值: 返回新的集合

示例:

>>> # 参数中有集合,元组,列表
>>> set.union({2, 3}, (3, 5), [5, 6])
{2, 3, 5, 6}

6.update 方法

作用:向集合S 中添加元素

原型:S.update(...) -> None

参数:任意多个可迭代类型数据

返回值:总是返回 None

示例:

>>> s = set({2})
>>> s
{2}
>>> s.update({3, 5}, {5, 6}, [7, 8])
>>> s
{2, 3, 5, 6, 7, 8}

7.clear 方法

作用:清空集合S

原型:S.clear() -> None

参数:无

返回值:总是返回None

示例:

>>> s = set([1, 3, 5])
>>> s
{1, 3, 5}
>>> s.clear()
>>> s # 集合为空
set()

8.copy 方法

作用:浅拷贝集合S

原型:S.copy( ) -> set

参数:无

返回值:一个集合

示例:

>>> s = set([1, 3, 5])
>>> s
{1, 3, 5}
>>> s1 = s.copy()
>>> s1
{1, 3, 5}

9.difference 方法

作用:集合的差集

原型:S.difference(...) -> set

参数:任意多个可迭代类型数据

返回值:一个集合

示例:

>>> s = set([1, 3, 5, 6])
>>> # 参数可以是任意的可迭代类型
>>> s.difference({1}, [3], (4, 5))
{6}

10.difference_update 方法

作用:集合的差集,与difference 方法的不同是,difference_update 直接在集合S 上做修改

原型:S.difference_update(...) -> None

参数:任意多个可迭代类型数据

返回值:总是返回None

示例:

>>> s = set([1, 3, 5, 6])
>>> s.difference_update({1}, [3], (4, 5))
>>> s
{6}

11.intersection 方法

作用:集合的交集

原型:S.intersection(...) -> set

参数:任意多个可迭代类型数据

返回值:一个集合

示例:

>>> s = set([1, 3, 5, 6])
>>> s.intersection({1}, [3], (4, 5)) # 相当于 s & {1} & [3] & (4, 5)
set()
>>> s.intersection({1, 3}, [3, 4], (3, 4, 5)) # 相当于 s & {1, 3} & [3,4] & (3, 4, 5)
{3}

12.intersection_update 方法

作用:集合的交集,与intersection 方法的不同是,intersection_update 直接在集合S 上做修改

原型:S.difference_update(...) -> None

参数:任意多个可迭代类型数据

返回值:总是返回None

示例:

>>> s = set([1, 3, 5, 6])
>>> s.intersection_update({1, 3}, [3,4], (3, 4, 5))
>>> s
{3}

13.isdisjoint 方法

作用:用于判断两个集合中是否有相同的元素

原型:S.isdisjoint(...) -> bool

参数:任意可迭代类型数据

返回值:如果有相同的元素,返回False,否则,返回True

示例:

>>> s1 = set([1, 2, 3])
>>> s2 = set([3, 4, 5])
>>> s3 = set([5, 6])
>>> s1.isdisjoint(s2) # s1, s2 中有相同的元素
False
>>> s1.isdisjoint(s3) # s1, s3 中没有相同的元素
True
>>> s1.isdisjoint((4, 5)) # 参数是元组
True

14.issubset 方法

作用:判断集合S 是否是另一个集合的子集

原型:S.issubset(...) -> bool

参数:任意可迭代类型数据

返回值bool 类型

示例:

>>> s = set([1, 3, 5])
>>> s.issubset({1, 3, 5, 7}) # 参数是字典
True
>>> s.issubset([1, 3, 5, 7]) # 参数是数组
True
>>> s.issubset([1, 3, 7])
False

15.issuperset 方法

作用:判断一个集合是否是另一个集合S 的子集,是issubset方法的反义

原型:S.issuperset(...) -> bool

参数:任意可迭代类型数据

返回值bool 类型

示例:

>>> s.issuperset({1, 3, 5, 7})
False
>>> s.issuperset({1, 3})
True

16.symmetric_difference 方法

作用:返回两个集合中不重复的元素集合

原型:S.symmetric_difference(...) -> set

参数:任意可迭代类型数据

返回值:一个集合

示例:

>>> s = set([1, 3, 5])
>>> s
{1, 3, 5}
>>> s.symmetric_difference([8, 9])
{1, 3, 5, 8, 9}
>>> s.symmetric_difference([8, 3])
{8, 1, 5}

17.symmetric_difference_update 方法

作用:求两个集合中不重复的元素集合,与symmetric_difference方法的不同是,symmetric_difference_update 方法,直接在S 修改

原型:S.symmetric_difference_update(...) -> None

参数:任意可迭代类型数据

返回值:总是返回None

示例:

>>> s = set([1, 3, 5])
>>> s.symmetric_difference_update({6, 8})
>>> s
{1, 3, 5, 6, 8}
>>> s.symmetric_difference_update({6, 8})
>>> s
{1, 3, 5}

(完。)


推荐阅读:

Python 简明教程 --- 8,Python 字符串函数

Python 简明教程 --- 9,Python 编码

Python 简明教程 --- 10,Python 列表

Python 简明教程 --- 11,Python 元组

Python 简明教程 --- 12,Python 字典


欢迎关注作者公众号,获取更多技术干货。

Python 简明教程 --- 13,Python 集合的更多相关文章

  1. Python 简明教程 --- 18,Python 面向对象

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 代码能借用就借用. -- Tom Duff 目录 编程可分为面向过程编程和面向对象编程,它们是两种不 ...

  2. Python 简明教程 --- 14,Python 数据结构进阶

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 如果你发现特殊情况太多,那很可能是用错算法了. -- Carig Zerouni 目录 前几节我们介 ...

  3. Python 简明教程 --- 15,Python 函数

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 测试只能证明程序有错误,而不能证明程序没有错误. -- Edsger Dijkstra 目录 本节我 ...

  4. Python 简明教程 --- 16,Python 高阶函数

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 对于那些快速算法,我们总是可以拿一些速度差不多但是更容易理解的算法来替代它们. -- Douglas ...

  5. Python 简明教程 --- 17,Python 模块与包

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 正确的判断来源于经验,然而经验来源于错误的判断. -- Fred Brooks 目录 我们已经知道函 ...

  6. python简明教程

    Python简明教程 MachinePlay关注 0.7072018.09.26 01:49:43字数 2,805阅读 9,287 Python一小时快速入门 1.Python简介   pylogo. ...

  7. Python 简明教程 --- 8,Python 字符串函数

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 好代码本身就是最好的文档.当你需要添加一个注释时,你应该考虑如何修改代码才能不需要注释. -- St ...

  8. Python 简明教程 ---10,Python 列表

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 程序 = 算法 + 数据结构 -- Nicklaus Wirth 目录 从这句话程序 = 算法 + ...

  9. Python 简明教程 --- 5,Python 表达式与运算符

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 靠代码行数来衡量开发进度,就像是凭重量来衡量飞机制造的进度. -- Bill Gates 目录 1, ...

随机推荐

  1. akka-typed(3) - PersistentActor has EventSourcedBehavior

    akka-typed中已经没有PersistentActor了.取而代之的是带有EventSourcedBehavior的actor,也就是一种专门支持EventSource模式的actor.Even ...

  2. Java实现 蓝桥杯VIP 算法提高 彩票

    算法提高 彩票 时间限制:1.0s 内存限制:256.0MB 问题描述 为丰富男生节活动,贵系女生设置彩票抽奖环节,规则如下: 1.每张彩票上印有7个各不相同的号码,且这些号码的取值范围为[1, 33 ...

  3. Java实现 洛谷 P1914 小书童——密码

    import java.util.Scanner; public class Main { private static Scanner cin; public static void main(St ...

  4. java实现第五届蓝桥杯排列序数

    排列序数 如果用a b c d这4个字母组成一个串,有4!=24种,如果把它们排个序,每个串都对应一个序号: abcd 0 abdc 1 acbd 2 acdb 3 adbc 4 adcb 5 bac ...

  5. PAT 在霍格沃茨找零钱

    如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易.”现在,给定 ...

  6. iOS-UIViewController创建的几种方法和UIWindow的介绍

    在上一篇笔记中<iOS-程序启动原理和UIApplication>,http://blog.csdn.net/yang198907/article/details/49735531 在程序 ...

  7. iOS-字典转双模型的实现过程中需要关注的细节

    如果有以上结构的plist文件,那么应该怎么将其中的字典转换成模型? 显然一个模型已经无法搞定了,此时需要用到双数据模型(字典转模型). 我写了两种方式来实现模型的转换: 方法一 第一个模型:CarM ...

  8. linux 删除文件后 df 查看磁盘空间并没有释放

    1.错误现象 Linux 磁盘空间总是报警,查到到大文件,删除之后,df看到磁盘空间并没有释放. 用du -sh ./* | sort -nr (查看当前目录下文件的大小)通过查找了下发现文件被mys ...

  9. 04-Python基础3

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  10. Java 多线程基础(三) start() 和 run()

    Java 多线程基础(三) start() 和 run() 通过之前的学习可以看到,创建多线程过程中,最常用的便是 Thread 类中的 start() 方法和线程类的 run() 方法.两个方法都包 ...