• python基础之集合


    本文简单讨论一下另外一种常见的数据类型:集合。

    1.集合的定义:

    new_set={1,2,3,{12,3},[1,2],'hehe',(1,2),{'key':'value'}}

    集合用"{}符号表示,这种表示方法与字典的标志一致,不过字典的每一个元素都是一对键值对,而集合的每一个元素就是一个简单的元素。集合的元素可以是数据,列表,元组,字典,以及集合。

    2.集合的性质:

    (1)集合是无序的

      集合同字典一样,是无序的,因此不能用while循环遍历,不可以用索引查找,但是可以用for循环遍历。

    (2)可以用set方法将其他类型转(可迭代对象)为集合(可变集合):

     1 new_set=set('hellio')
     2 new_set1=set([1,2,3])
     3 new_set2=set([1,'hello'])
     4 #new_set3=set(123)//数据类型不是可迭代对象,不可以使用set方法
     5 new_set4=set((12,34))
     6 new_set5=set({'key1':'value','key2':'value2'})
     7 print(new_set)
     8 print(new_set1)
     9 print(new_set2)
    10 #print(new_set3)
    11 print(new_set4)
    12 print(new_set5)

    这段代码执行结果:

    分析结果可知,对于字符串,set方法会把字符串中的每一个字符作为集合中的一个元素,会把列表和元组中的每一个元素都变成集合中的一个元素。而对于字典,则会默认把字典的key值作为集合中每一个元素加入集合中。

    (3)集合没有重复元素:

      集合中没有重复的元素,因此在使用set方法时,集合会自动去重。因此对于set('hello')这句代码,执行后生成的集合只会有一个'l'元素。

    (4)集合不可hash。

      集合是不可hash的数据类型。因此目前为止,数字,字符串,列表,元组,字典,集合中,我们可以总结如下:数字,字符串,元组是可hash的数据类型,而列表,字典,集合是不可hash的数据类型.可hash代表着该数据类型是不可变的(即容器大小不可以改变),可以作为字典的key值,不可hash意味着该数据类型是可以改变的(即容器大小可以改变),这类数据类型不可以作为字典的key值

    3.集合的常见方法:

    (1)向集合添加元素(add):

    1 s={1,2,3}
    2 print(s)
    3 #s.add([1,2,3])  #错误,add的参数必须是一个可hash的数据类型
    4 s.add('hello')
    5 s.add(12)
    6 s.add((23,45))
    7 #s.add({'key':'value'})# 字典不是可hash的数据类型
    8 #s.add({1,3})# 集合不是可hash的值
    9 print(s)

      注意:add方法的参数必须是一个可hash的数据类型,即不可变的数据类型,因此字典,列表,集合不可以作为add的参数。add会把该传入的不可变参数作为集合的一个元素加入集合中。

    (2)清空集合(clear):

    s={1,2,3}
    s.clear()

    清空集合中所有元素

    (3)复制集合(copy)

    s={1,2,3}
    s1=s.copy()
    print(s1)

      复制一个集合(浅拷贝)

    (4)删除集合中的元素

      a.随机删除集合中的一个元素(pop) 

    1 s={23,1,2,3,'hell','wqww'}
    2 s1=s.pop()
    3 print(s)
    4 print(s1)

    因为集合是无序的,因此pop()方法会在集合中随机删除一个元素,并返回删除的元素

      b.删除集合中指定的元素

    1 s={23,1,2,3,'hell','wqww'}
    2 s.remove(1)
    3 s.discard(90)

      remove()函数和discard()函数都可以删除集合中的一个指定元素,两个函数不同之处在于,如果传入的参数在集合中不存在,remove函数会报错,而discard则不会。

    (5)判断是否是子集和父集(issubset(),issupperset())

    1 s1={1,2,3,4}
    2 s2={2,3}
    3 print(s2.issubset(s1)) #判断s2是否是s1的子集,如果是返回true,否则返回false
    4 print(s1.issuperset(s2)) #判断s1是否是s2的父集,如果是返回true,否则返回false

    (6)判断两个集合是否有相同的元素(交集是否为空)(isdisjoint)

    s1={1,2,3,4}
    s2={5,6,7}
    print(s1.isdisjoint(s2))#如果交集为空,返回true,否则返回false

    (7)删除掉一个结合中包含另一个集合中的元素(different_update)

    1 s1={1,2,3,4}
    2 s2={5,6,2}
    3 s1.difference_update((s2))#删除s1中包含s2中的元素
    4 print(s1)

    (8)一次向集合中添加多个元素(update)

    1 s1={1,2}
    2 s2={1,2,3}
    3 s1.update(s2)#add一次只能添加一个元素,update可以一次添加多个元素
    4 print(s1)

    4.创建不可变的集合(frozenset())

      set方法创建的集合是可变的集合,如果想要创建一个不可变的集合,则可以用frozenset()函数,该函数与set函数用法一致,只是创建的集合是不可变的,即不能新增和删除集合中的元素。

    5.集合的交并补

      集合A={a,b,c,d},集合B={b,c,e,f}。两个集合的交集指的是那些同时在两个集合中出现的元素,集合A和B的交集为{b,c}。两个集合的并集指的是包含两个集合的所有元素的一个集合(重复的元素出现一次),集合A和集合B的并集为{a,b,c,d,e,f}。两个集合的补集指的是出现在一个集合中但不出现在另一个集合中的那些元素(即该集合所特有的元素)。A-B={a,d}。两个集合的交叉补集指的是两个集合中那些只出现在其中一个集合的元素的集合。交叉补集可以看做说两个集合相互求补集然后求并集,或者可以理解为两个集合的并减去两个集合的交集

    集合的交(intersection)

    1 s1={'a','b','c','d'}
    2 s2={'b','c','e','f'}
    3 s3=s1 & s2
    4 s4=s1.intersection(s2)
    5 print(s3)
    6 print(s4)

    求集合的交可以用‘&’直接求,也可以用集合的intersection()方法。这两个方法得到的结果相同。

    集合的并(union)

    s1={'a','b','c','d'}
    s2={'b','c','e','f'}
    s3=s1 | s2
    s4=s1.union(s2)
    print(s3)
    print(s4)

    求集合的并可以使用‘|’符号,也可以使用集合的union()方法

    集合的补集

    s1={'a','b','c','d'}
    s2={'b','c','e','f'}
    s3=s1-s2
    s4=s1.difference(s2)
    print(s3)
    print(s4)

    集合的补集可以用‘-’,也可以用集合的difference()方法

    集合的交叉补集

    s1={'a','b','c','d'}
    s2={'b','c','e','f'}
    s3=s1^s2
    s4=s1.symmetric_difference(s2)
    print(s3)
    print(s4)

    集合的交叉补集可以用‘^’符号求,也可以用集合的symetric_difference()方法

  • 相关阅读:
    p2394 精度题
    线性筛素数
    poj3468 线段树的懒惰标记
    逆元
    2018 Multi-University Training Contest 2
    2018 Multi-University Training Contest 1
    判断素数遇到的问题
    Mergeable Stack(链表实现栈)
    组合数
    poj2594 机器人寻找宝藏(最小路径覆盖)
  • 原文地址:https://www.cnblogs.com/jiachuantang/p/8376805.html
Copyright © 2020-2023  润新知