zoukankan      html  css  js  c++  java
  • Python 简明教程 --- 13,Python 集合

    微信公众号:码农充电站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 字典


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

    码农充电站pro

  • 相关阅读:
    程序设计网站综合
    .net 获取url的方法(转)
    制作简单的语音识别系统(阅读文章)
    创建 WPF 不规则窗口
    高斯消元法
    How many ways(DFS记忆化搜索)
    I NEED A OFFER!
    免费馅饼
    N^N(Leftmost Digit )
    Common Subsequence
  • 原文地址:https://www.cnblogs.com/codeshell/p/13040436.html
Copyright © 2011-2022 走看看