Python中的元素仓库之集合(set)

首先了解集合有什么特点。

集合(set)是python中的一种存放数据的仓库,和列表,字典,元组等等数一样的。

set的一些特点:

  • 可以用花括号”{“来定义
  • 其中的元素没有序列,也就是非序列类型的数据。
  • set中的元素不可重复这个就是类似于dict的键。
1
2
3
4
5
6
7
8
9
# 定义set类型的变量
>>> s1 = {1,2,3}
>>> s1
{1, 2, 3}
>>> type(s1)
<class 'set'>
>>> s2 = {1,1,1,1,1,1,1,1,1}
>>> s2
{1}

这里可以了解到set类型中的元素是不允许有重复的。

由于set元素不重复的特点,可以使用set去重:

1
2
3
4
5
6
7
8
>>> list1 = [1,2,1,2,1,2,1,2,1,2,4,4,5,6]
>>> set1 = set(list1)
>>> set1
{1, 2, 4, 5, 6}
>>> isinstance(set1,set)
True
>>> isinstance(list1, list)
True

类似的,使用set()方法对字典进行去重,不指定参数的情况下默认的是对字典的键转换成集合的形式。但是字典中的键是不允许重复的(其实是出现了重复的情况的时候,后面的会将前面的值覆盖掉)。但是字典的值是可以出现重复的,假设有一个字典dict1 = {'name1':'...', 'name2':'...','name3':'...','name4':'...'},我们对其中的值可以去重:set1 = set(dict1.values())


set类型有一些常用的方法:

  • add()方法添加元素,添加已有的元素不会报错。

    1
    2
    3
    4
    5
    6
    7
    >>> nums = {1,2,3}
    >>> nums.add(1)
    >>> nums
    {1, 2, 3}
    >>> nums.add(4)
    >>> nums
    {1, 2, 3, 4}
  • pop()方法,弹出集合中的第一个元素,并且将其删除

    1
    2
    >>> nums.pop()
    1
  • remove()方法,删除集合中的元素,必须有参数,传进来的参数是要删除的元素的值

    1
    2
    3
    4
    5
    6
    7
    >>> nums.remove()
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: remove() takes exactly one argument (0 given)
    >>> nums.remove(2)
    >>> nums
    {3, 4}
  • update()方法,向集合中添加元素,但是传入的元素必须是可以遍历的值,然后拆开放入集合中,当不传入参数额时候就不对原来的集合做改动

    1
    2
    3
    4
    5
    6
    >>> nums.update()
    >>> nums
    {3, 4}
    >>> nums.update('string')
    >>> nums
    {3, 4, 't', 'i', 'n', 'g', 'r', 's'}
  • copy()方法就像它的名字一样,就是对集合的一个浅复制,对得到的复制的集合和对当前的集合操作,都互不影响。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    >>> nums1 = nums.copy()
    >>> nums1
    {3, 4, 't', 'i', 'n', 'g', 'r', 's'}
    >>> nums.remove('i')
    >>> nums
    {3, 4, 't', 'n', 'g', 'r', 's'}
    >>> nums1
    {3, 4, 't', 'i', 'n', 'g', 'r', 's'}
    >>> nums1.remove('s')
    >>> nums1
    {3, 4, 't', 'i', 'n', 'g', 'r'}
    >>> nums
    {3, 4, 't', 'n', 'g', 'r', 's'}
    >>> 3 in nums
    True
    >>> 7 in nums1
    False
    >>> 8 not in nums
    True
    >>> nums.add('i')
    >>> nums
    {3, 4, 't', 'i', 'n', 'g', 'r', 's'}

下面的这几个操作和离散数学中的一些概念很类似:

  • 判断前面的集合(这里是nums1)中的所有的元素是不是后面的集合(这里是nums)里都存在

    1
    2
    3
    4
    5
    6
    >>> nums1 <= nums
    True
    >>> nums1 >= nums
    False
    >>> nums >= nums1
    True
  • 分隔符”|”在这里是求并集的意思

    1
    2
    >>> nums|nums1
    {3, 4, 't', 'i', 'n', 'g', 'r', 's'}
  • ‘&’在这里是求交集的意思,就是返回两个集合的公共的元素

    1
    2
    >>> nums&nums1
    {3, 4, 't', 'i', 'g', 'n', 'r'}
  • 减号’-‘在这里是求差集的意思,也就是返回一个只在前面的集合(nums)存在并且不在后面的集合(nums1)中存在的元素。

    1
    2
    >>> nums - nums1
    {'s'}
  • ‘^’返回一个集合,其中的元素是两者不一样的部分,在这里是(ums-nums1) | (nums1 - nums)

    1
    2
    >>> nums ^ nums1
    {'s'}
  • 可以看到1或者12这样的整形数是不能遍历的,而’123’这样的字符串,甚至’1’这样的字符串都是可以遍历的

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    >>> nums
    {3, 4, 't', 'i', 'n', 'g', 'r', 's'}
    >>> nums.update(1)
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: 'int' object is not iterable
    >>> nums.update(12)
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: 'int' object is not iterable
    >>> nums.update('12')
    >>> nums
    {3, 4, 't', 'i', '1', '2', 'n', 'g', 'r', 's'}
    >>> nums.update('1')
    >>> nums
    {3, 4, 't', 'i', '1', '2', 'n', 'g', 'r', 's'}