Python-集合

  1. 集合
    1. 集合的创建
    2. 集合间的关系
    3. 集合的数学操作
    4. 集合查操作
    5. 集合的增操作
    6. 集合的删操作
    7. 不可变集合,frozenset

集合

可以把集合看做是没有存储vlaue的字典,集合的特点和字典类似,如下:

  1. 集合中不能存在重复的数据
  2. 集合中的key是无序的
  3. 集合中的数据可以是任何不可变类型,并且多种类型的数据可以混合存贮在一个集合中
  4. 集合可以根据需要动态伸缩,在使用前无需事先声明集合的容量
  5. 集合会浪费大量的内存,用空间换时间

集合的创建

1、使用花括号{},集合会去除重复的元素,并无序排列

>>> s = {5, 1, 2, 6, 2, 1}
>>> s
{1, 2, 5, 6}

2、调用内置函数set()
传入迭代器对象

>>> s = set(range(6))
>>> s
{0, 1, 2, 3, 4, 5}

传入字典

>>> s = set([5, 1, 2, 6, 2, 1])
>>>
>>> s
{1, 2, 5, 6}

传入元组

>>> s = set((5, 1, 2, 6, 2, 1))
>>> s
{1, 2, 5, 6}

传入字符串

>>> s = set('1231231')
>>> s
{'1', '2', '3'}

创建空集合

>>> s = set()
>>> s
set()

集合间的关系

1、判断两个集合是否相等

>>> s1 = {1, 3, 5, 7, 9}
>>> s2 = {5, 3, 7, 9, 1}
>>> s1 == s2
True

2、判断集合是否是另一个集合的子集

>>> s1 = {1, 3, 5, 7, 9}
>>> s2 = {2, 3, 6, 7, 10}
>>> s3 = {1, 3, 5, 6, 7, 9}
>>>
>>> s1.issubset(s2)
False
>>>
>>> s1.issubset(s3)
True

3、判断集合是否是另一个集合的超集

>>> s1 = {1, 3, 5, 7, 9}
>>> s2 = {2, 3, 6, 7, 10}
>>> s3 = {1, 3, 5, 6, 7, 9}

>>> s2.issuperset(s1)
False
>>> s3.issuperset(s1)
True

4、判断两个集合是否没有交集

>>> s1 = {1, 3, 5, 7, 9}
>>> s2 = {2, 3, 6, 7, 10}
>>> s3 = {2, 4, 6, 8, 10}
>>>
>>> s1.isdisjoint(s2)
False
>>> s1.isdisjoint(s3)
True

集合的数学操作

1、使用intersection()方法求交集,原集合不变,等价于使用&符号

>>> s1 = {1, 3, 5, 7, 9}
>>> s2 = {2, 3, 6, 7, 10}

>>> s1.intersection(s2)
{3, 7}

>>> s1 & s2
{3, 7}

s1.intersection_update(s2)方法,用s1.intersection(s2)的返回值更新集合s1,s2不变,返回值为None

>>> s1 = {1, 3, 5, 7, 9}
>>> s2 = {2, 3, 6, 7, 10}

>>> s1.intersection_update(s2)
>>> s1
{3, 7}
>>> s2
{2, 3, 6, 7, 10}

2、并集
使用union()求并集,原集合不变,不存在方法union_update(),等价于使用|符号

>>> s1 = {1, 3, 5, 7, 9}
>>> s2 = {2, 3, 6, 7, 10}
>>> s1.union(s2)
{1, 2, 3, 5, 6, 7, 9, 10}

>>> s1 | s2
{1, 2, 3, 5, 6, 7, 9, 10}

3、使用difference()方法求补集,原集合不变,等价于使用“-”符号

>>> s1 = {1, 3, 5, 7, 9}
>>> s2 = {2, 3, 6, 7, 10}

>>> s1.difference(s2)
{1, 5, 9}
>>> s2.difference(s1)
{2, 10, 6}

>>> s1 - s2
{1, 5, 9}
>>> s2 - s1
{2, 10, 6}

s1.difference_update(s2)方法,用s1.difference(s2)的返回值更新集合s1,s2不变,返回值为None

>>> s1 = {1, 3, 5, 7, 9}
>>> s2 = {2, 3, 6, 7, 10}

>>> s1.difference_update(s2)
>>> s1
{1, 5, 9}
>>> s2
{2, 3, 6, 7, 10}

4、使用symmetric()方法求对称补集,原集合不变,等价于使用^符号

>>> s1 = {1, 3, 5, 7, 9}
>>> s2 = {2, 3, 6, 7, 10}
>>> s1.symmetric_difference(s2)
{1, 2, 5, 6, 9, 10}

>>> s1 ^ s2
{1, 2, 5, 6, 9, 10}

s1.symmetric_update(s2)方法,用s1.symmetric(s2)的返回值更新集合s1,s2不变,返回值为None

>>> s1 = {1, 3, 5, 7, 9}
>>> s2 = {2, 3, 6, 7, 10}
>>> s1.symmetric_difference_update(s2)
>>> s1
{1, 2, 5, 6, 9, 10}
>>> s2
{2, 3, 6, 7, 10}

集合查操作

使用in关键字判断

>>> s1
{1, 2, 5, 6, 9, 10}
>>>
>>>
>>> 1 in s1
True
>>>
>>> 3 in s1
False

集合的增操作

1、使用add()方法,一次只添加一个元素

>>> s1
{1, 2, 5, 6, 9, 10}
>>>
>>> s1.add(8)
>>> s1
{1, 2, 5, 6, 8, 9, 10}

2、使用update()方法,

>>> s1 = {1, 2, 3, 4, 5}

传入集合

>>> s1.update({6, 7})
>>> s1
{1, 2, 3, 4, 5, 6, 7}
>>>

传入列表

>>> s1.update([8, 9])
>>> s1
{1, 2, 3, 4, 5, 6, 7, 8, 9}

传入元组

>>> s1.update((10,))
>>> s1
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

集合的删操作

1、使用remove()方法,一次只能删除一个元素

>>> s1
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

>>> s1.remove(5)
>>> s1
{1, 2, 3, 4, 6, 7, 8, 9, 10}

>>> s1.remove(11)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 11

2、使用discard()方法,如果指定的元素在集合中不存在,不会抛出错误,一次只能删除一个元素

>>> s1
{1, 2, 3, 4, 6, 7, 8, 9, 10}
>>>
>>> s1.discard(6)
>>> s1
{1, 2, 3, 4, 7, 8, 9, 10}
>>>
>>> s1.discard(11)
>>> s1
{1, 2, 3, 4, 7, 8, 9, 10}

3、使用方法pop(),不能传递参数,一次只删除一个元素,并返回被删除的元素

>>> s1
{1, 2, 3, 4, 7, 8, 9, 10}
>>> s1.pop()
1
>>> s1.pop()
2
>>> s1.pop()
3
>>> s1
{4, 7, 8, 9, 10}

4、使用clear()方法,清空集合

>>> s1
{4, 7, 8, 9, 10}

>>> s1.clear()
>>> s1
set()

不可变集合,frozenset

frozenset是不可变类型,因此存在hash值,可以作为字典的key,也可以作为set中的元素

使用内置函数frozenset(),创建frozenset

>>> frozenset()
frozenset()

>>> frozenset(range(1, 6))
frozenset({1, 2, 3, 4, 5})

>>> frozenset([1, 2, 3, 4, 5])
frozenset({1, 2, 3, 4, 5})

>>> frozenset((1, 2, 3, 4, 5))
frozenset({1, 2, 3, 4, 5})

>>> frozenset('12345')
frozenset({'1', '3', '2', '5', '4'})

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 289211569@qq.com