zoukankan      html  css  js  c++  java
  • python集合

    之前看到的列表和字符串都是一种有序序列,而集合 set 是一种无序的序列。

    因为集合是无序的,所以当集合中存在两个同样的元素的时候,Python只会保存其中的一个(唯一性);同时为了确保其中不包含同样的元素,集合中放入的元素只能是不可变的对象(确定性)。

    集合生成

    可以用set()函数来显示的生成空集合:

    a = set()
    type(a)
    
    set
    

    也可以使用一个列表来初始化一个集合:

    a = set([1, 2, 3, 1])
    a
    
    {1, 2, 3}
    

    集合会自动去除重复元素 1

    可以看到,集合中的元素是用大括号{}包含起来的,这意味着可以用{}的形式来创建集合:

    a = {1, 2, 3, 1}
    a
    
    {1, 2, 3}
    

    但是创建空集合的时候只能用set来创建,因为在Python中{}创建的是一个空的字典:

    s = {}
    type(s)
    
    dict
    

    集合操作

    欢迎加入我的QQ群`923414804`与我一起学习,群里有我学习过程中整理的一些资料。有不懂的我也可以给你解答。
    

    假设有这样两个集合:

    a = {1, 2, 3, 4}
    b = {3, 4, 5, 6}
    

    两个集合的并,返回包含两个集合所有元素的集合(去除重复)。

    可以用方法 a.union(b) 或者操作 a | b 实现。

    a.union(b)
    
    {1, 2, 3, 4, 5, 6}
    
    b.union(a)
    
    {1, 2, 3, 4, 5, 6}
    
    a | b
    
    {1, 2, 3, 4, 5, 6}
    

    两个集合的交,返回包含两个集合共有元素的集合。

    可以用方法 a.intersection(b) 或者操作 a & b 实现。

    a.intersection(b)
    
    {3, 4}
    
    b.intersection(a)
    
    {3, 4}
    
    a & b
    
    {3, 4}
    
    print(a & b)
    
    set([3, 4])
    

    注意:一般使用print打印set的结果与表示方法并不一致。

    ab 的差集,返回只在 a 不在 b 的元素组成的集合。

    可以用方法 a.difference(b) 或者操作 a - b 实现。

    a.difference(b)
    
    {1, 2}
    
    a - b
    
    {1, 2}
    

    注意,a - bb - a并不一样,b - a 返回的是返回 b 不在 a 的元素组成的集合:

    b.difference(a)
    
    {5, 6}
    
    b - a 
    
    {5, 6}
    

    对称差

    ab 的对称差集,返回在 a 或在 b 中,但是不同时在 ab 中的元素组成的集合。

    可以用方法 a.symmetric_difference(b) 或者操作 a ^ b 实现(异或操作符)。

    a.symmetric_difference(b)
    
    {1, 2, 5, 6}
    
    b.symmetric_difference(a)
    
    {1, 2, 5, 6}
    
    a ^ b
    
    {1, 2, 5, 6}
    

    包含关系

    假设现在有这样两个集合:

    a = {1, 2, 3}
    b = {1, 2}
    

    要判断 b 是不是 a 的子集,可以用 b.issubset(a) 方法,或者更简单的用操作 b <= a

    b.issubset(a)
    
    True
    
    b <= a
    
    True
    

    与之对应,也可以用 a.issuperset(b) 或者 a >= b 来判断:

    a.issuperset(b)
    
    True
    
    a >= b
    
    True
    

    方法只能用来测试子集,但是操作符可以用来判断真子集:

    a <= a
    
    True
    

    自己不是自己的真子集:

    a < a
    
    False
    

    集合方法

    add 方法向集合添加单个元素

    跟列表的 append 方法类似,用来向集合添加单个元素。

    s.add(a)
    

    将元素 a 加入集合 s 中。

    t = {1, 2, 3}
    t.add(5)
    t
    
    {1, 2, 3, 5}
    

    如果添加的是已有元素,集合不改变:

    t.add(3)
    t
    
    {1, 2, 3, 5}
    

    update 方法向集合添加多个元素

    跟列表的extend方法类似,用来向集合添加多个元素。

    s.update(seq)
    

    seq中的元素添加到s中。

    t.update([5, 6, 7])
    t
    
    {1, 2, 3, 5, 6, 7}
    

    remove 方法移除单个元素

    s.remove(ob)
    

    从集合s中移除元素ob,如果不存在会报错。

    t.remove(1)
    t
    
    {2, 3, 5, 6, 7}
    
    t.remove(10)
    
    ---------------------------------------------------------------------------
    
    KeyError                                  Traceback (most recent call last)
    
    <ipython-input-31-3bc25c5e1ff4> in <module>()
    ----> 1 t.remove(10)
    
    
    KeyError: 10
    

    pop方法弹出元素

    由于集合没有顺序,不能像列表一样按照位置弹出元素,所以pop 方法删除并返回集合中任意一个元素,如果集合中没有元素会报错。

    t.pop()
    
    {3, 5, 6, 7}
    
    print t
    
    set([3, 5, 6, 7])
    
    s = set()
    # 报错
    s.pop()
    
    ---------------------------------------------------------------------------
    
    KeyError                                  Traceback (most recent call last)
    
    <ipython-input-34-9f9e06c962e6> in <module>()
          1 s = set()
          2 # 报错
    ----> 3 s.pop()
    
    
    KeyError: 'pop from an empty set'
    

    discard 方法

    作用与 remove 一样,但是当元素在集合中不存在的时候不会报错。

    t.discard(3)
    
    t
    
    {5, 6, 7}
    

    不存在的元素不会报错:

    t.discard(20)
    
    t
    
    {5, 6, 7}
    

    difference_update方法

    a.difference_update(b)
    

    从a中去除所有属于b的元素:

  • 相关阅读:
    LeetCode 32. 最长有效括号(Longest Valid Parentheses)
    LeetCode 141. 环形链表(Linked List Cycle)
    LeetCode 160. 相交链表(Intersection of Two Linked Lists)
    LeetCode 112. 路径总和(Path Sum)
    LeetCode 124. 二叉树中的最大路径和(Binary Tree Maximum Path Sum)
    LightGBM新特性总结
    sql service 事务与锁
    C#泛型实例详解
    C# 中的委托和事件(详解)
    C# DateTime日期格式化
  • 原文地址:https://www.cnblogs.com/paisenpython/p/10266419.html
Copyright © 2011-2022 走看看