zoukankan      html  css  js  c++  java
  • Python数据类型--集合简介

    集合(set)是数学中的基本概念。它的严格定义非常抽象,我们可以简单的认为集合是一个包含无序元素的容器,每一个元素都是不同的。集合之间可以有并、交等操作。Python内置了对集合类型的支持。

    集合定义

    Python中可以有两种方法定义集合(set)对象:

    • 内置的Set()函数
    • 操作符 {}

    使用set()函数

    set()函数需要一个可迭代类型(iterable)的参数,如列表、元组等。语法如下:

    var_set = set(iterable)

    例如:

    >>> s1 = set(['a','b','c','d','e','a','b'])
    >>> s1
    {'b', 'c', 'd', 'a', 'e'}
    >>> s2 = set((1,2,3,4,3,4))
    >>> s2
    {1, 2, 3, 4}
     

    从上面的例子中可以发现集合的重要特点:

    • 集合不对元素进行排序
    • 集合会去掉重复的元素

    集合去重的特点常被用来判别元素是否存在。

    Python中字符串也是可迭代类型,也可以作为set()函数的参数,生成字符集合。

    >>> s3 = set('abcdefabc')
    >>> s3
    {'c', 'a', 'e', 'd', 'b', 'f'}
     

    使用{}操作符

    集合也可以使用{}操作符来定义,语法如下:

    var_set = {item1, item2, ...}

    例如:

    >>> s4 = {'abc','foo','bar','def','abc','xyz','def'}
    >>> s4
    {'def', 'bar', 'abc', 'foo', 'xyz'}
    >>> s5 = {1, 3, 4, 5, 6, 3, 6}
    >>> s5
    {1, 3, 4, 5, 6}
     

    使用{}定义集合时,字符串会作为一个独立的元素放入集合,而使用set()函数时,字符串作为一个可迭代类型会被遍历后将字符放入集合。

    定义空集合

    对于表达式{},Python解释为空的字典(dict),所以定义空的集合必须使用函数set()

    >>> s6 = set()
    >>> s6
    set()
    >>> s7 = {}
    >>> s7
    {}
    >>> type(s7)
    <class 'dict'>
    >>> type(s6)
    <class 'set'>
    >>> s7.add('a')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'dict' object has no attribute 'add'
    >>> s6.add('a')
    >>> s6
    {'a'}
     

    使用集合

    元素不可更改(immutable)

    Python集合中的元素不需要具有相同或者同类的类型,可以包含不同类型的元素。

    >>> s8 = {'a','b','c',1,2,3,4.5,('x','y','z')}
    >>> s8
    {1, 'c', 2, 3, 4.5, 'a', ('x', 'y', 'z'), 'b'}
    >>>
     

    Python集合类型是可修改类型(mutable),但是集合内的元素必须是不可修改类型(immutable)

    >>> s8 = {'a','b','c',1,2,3,4.5,('x','y','z')}
    >>> s8
    {1, 'c', 2, 3, 4.5, 'a', ('x', 'y', 'z'), 'b'}
    >>> s9 = {'a','b','c',['x','y','z']}
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'
     

    由于元组类型(tuple)是不可修改类型,所以它可以出现在集合中,而列表(list)是可修改类型,所以不能出现在集合中。

    操作集合元素

    遍历集合元素

    使用for循环遍历集合元素

    >>> s = {'a','b','c','xyz',1,2,3}
    >>> for x in s:
    ...     print(x)
    ...
    1
    c
    2
    3
    a
    xyz
    b
     

    元素归属判断

    使用in操作符判断元素是否属于集合

    >>> s = set('ab')
    >>> s
    {'b', 'a'}
    >>> 'a' in s
    True
    >>> 'x' in s
    False
     

    添加元素

    使用集合add方法添加元素

    >>> s = set('abc')
    >>> s
    {'b', 'c', 'a'}
    >>> s.add('d')
    >>> s.add('xyz')
    >>> s
    {'b', 'c', 'd', 'a', 'xyz'}
    >>>
     

    删除元素

    Python集合类型提供两个方法删除元素,分别是discardremove方法,两者的唯一区别在于对不存在的元素的处理上:

    • 调用Discard删除集合中不存在的元素,Discard不做任何处理
    • 调用Remove删除集合中不存在的元素,Remove抛出KeyError异常
    >>> s = set('abcdefghijk')
    >>> s
    {'c', 'a', 'e', 'j', 'd', 'k', 'i', 'b', 'f', 'g', 'h'}
    >>> s.discard('c')
    >>> s
    {'a', 'e', 'j', 'd', 'k', 'i', 'b', 'f', 'g', 'h'}
    >>> s.remove('a')
    >>> s
    {'e', 'j', 'd', 'k', 'i', 'b', 'f', 'g', 'h'}
    >>> s.discard('c')
    >>> s
    {'e', 'j', 'd', 'k', 'i', 'b', 'f', 'g', 'h'}
    >>> s.remove('a')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: 'a'
     

    Python集合还提供pop方法,pop随机的删除一个元素,并返回这个元素,如果是一个空集合,pop抛出KeyError异常。

    >>> s = set('ab')
    >>> x = s.pop()
    >>> x
    'b'
    >>> s
    {'a'}
    >>> y = s.pop()
    >>> y
    'a'
    >>> s
    set()
    >>> z = s.pop()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: 'pop from an empty set'
     

    Python还提供了clear方法,清空整个集合。

    操作集合

    Python提供了丰富的方法和函数操作集合对象

    方法 使用 说明
    len len(s) 返回集合s的元素个数
    union s1.union(s2) 返回一个新的集合,它是集合s1与s2的并集
    update s1.update(s2) 添加s2中所有元素到集合s1中
    intersection s1.intersection(s2) 返回一个新的集合,它是集合s1与s2的交集
    intersection_update s1.intersection_update(s2) 修改集合s1使它成为集合s1与s2的交集
    difference s1.difference(s2) 返回一个新的集合,它包含所有在s1中但不在s2中的元素
    difference_update s1.difference_update(s2) 从集合s1中删除所有s2中的元素
    symmetric_difference s1.symmetric_difference(s2) 返回一个新的集合,包含所有不同时在s1和s2中存在的元素
    symmetric_difference_update s1.symmetric_difference_update(s2) 修改集合s1,使其等于s1.symmetric_difference(s2)
    issubset s1.issubset(s2) 如果s1是s2的子集(相等也是子集),返回True
    issuperset s1.issuperset(s2) 如果s2是s1的子集,返回True
    isdisjoint s1.isdisjoint(s2) 如果s1和s2的交集为空,返回True

    Python同时还为集合类型重载了操作符,使操作更加方便:

    A | B <===> A.union(B)

    A |= B <===> A.update(B)

    A & B <===> A.intersection(B)

    A &= B <===> A.intersection_update(B)

    A - B <===> A.difference(B)

    A -= B <===> A.difference_update(B)

    A ^ B <===> A.symmetric_difference(B)

    A ^= B <===> A.symmetric_difference_update(B)

    A <= B <===> A.issubset(B)

    A >= B <===> A.issuperset(B)

    A < B <===> A <= B and A != B

    A > B <===> A >= B and A != B

    不可修改集合

    Python同时也提供不可修改的集合类型(frozenset),除了不可修改外,它与集合类型(set)完全一样,也就是说类似update这样的方法,frozenset不能使用,但是类似union这样的方法,它可以使用。

    >>> fs = frozenset('abcdef')
    >>> fs.add('x')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'frozenset' object has no attribute 'add'
    >>> fs.update({'x','y'})
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'frozenset' object has no attribute 'update'
    >>> fs.union({'x','y'})
    frozenset({'c', 'd', 'a', 'y', 'b', 'f', 'e', 'x'})
    >>> for x in fs:
    ...     print(x)
    ...
    c
    a
    e
    d
    b
    f
    >>>
     

    小结

    Python内置set类型具有以下特点:

    • 集合元素是无序的
    • 集合元素都是不同的,不允许有相同元素出现在一个集合中
    • 集合对象本身是可修改的,但是集合元素是不可修改的

    文章内容转载至:http://www.coolbox.top/article/show?article_id=14


    请相信自己

    当我们迷茫,懒惰,退缩的时候 我们会格外的相信命运 相信一切都是命中注定

    而当我们努力拼搏,积极向上时 我们会格外的相信自己

    所以命运是什么呢? 它是如果你习惯它 那它就会一直左右你

    如果你想挣脱它 那它就成为你的阻碍 可如果你打破了它 那它就是你人生的垫脚石!


    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

  • 相关阅读:
    日记功能发布
    功能小改进
    CuteEditor 6.0一个很奇怪的Bug
    关于博客园.NET俱乐部的公告
    新功能发布
    建立了一个博客园创业者QQ群
    思想决定生活 《卡耐基成功之道全书》读书笔记
    建立了一个英语学习小组
    实际上我没有选择的余地
    公告
  • 原文地址:https://www.cnblogs.com/suguangti/p/15227638.html
Copyright © 2011-2022 走看看