zoukankan      html  css  js  c++  java
  • python学习笔记(7)——集合(set)

    关键词#1.定义:无序不重复元素集, 基本功能包括关系测试和消除重复元素.

    2.关键词:类似dict、只有key无value、常用于集合类数学运算、

    3.创建

    s=set()  #入参可以是list、tuple、str、甚至dict
    

    示例:

    >>> s=set([1,2,3])
    >>> s
    {1, 2, 3}
    >>> s=set((1,2,3))
    >>> s
    {1, 2, 3}
    >>> s=set('123')
    >>> s
    {'3', '2', '1'}
    >>> s=set({'a':1,'b':2,'c':3})
    >>> s
    {'a', 'b', 'c'}
    PS.
    >>> s={}          #此方法py默认建立dict,而不是set
    >>> type(s)
    <class 'dict'>
    

    4.集合添加、删除

    添加=两种常用方法,分别是add和update。

    add

    >>> s=set('abc')  
    >>> s
    {'a', 'b', 'c'}
    >>> s.add('python')  #add方法:是把要传入的元素做为一个整个添加到集合中,入参限定每次一个
    >>> s
    {'python', 'a', 'b', 'c'}
    

    update(1):拆分添加

    >>> s=set('abc')
    >>> s.update('python') #update方法:是把要传入的元素拆分,做为个体传入到集合中
    >>> s
    {'h', 'n', 'y', 't', 'b', 'o', 'p', 'a', 'c'}
    

    update(2):合并set

    >>> set_1={1,2}
    >>> set_2={'a','b'}
    >>> set_3={'python','c#'}
    >>> set_1.update(set_2,set_3)
    >>> set_1
    {1, 2, 'b', 'python', 'c#', 'a'}
    

    常见错误

    >>> s=set([1,2,3])
    >>> s
    {1, 2, 3}
    >>> s.add([4,5])
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'
    >>>  #报错原因分析:在创建set时,入参可以是iterable,但创建完毕后,set内部元素的type是key,key不能是可变类型,如list,谨记!
    
    >>> s=set('abc')
    >>> s
    {'a', 'b', 'c'}
    >>> s.update('de')
    >>> s
    {'d', 'a', 'b', 'e', 'c'}
    >>> s.update(('f','g'))
    >>> s
    {'a', 'g', 'e', 'd', 'b', 'f', 'c'}
    >>> s.update([1,2,3])
    >>> s     #update入参规则同add,因为它会打散入参格式,所以只需审查入参最小单位=非可变 即可.
    {'a', 'g', 1, 2, 3, 'e', 'd', 'b', 'f', 'c'}
    >>> s.update([1,2,[4,5]])   #此处入参最小单位除int类1,2外还有一个[4,5]是list类型,所以报错.
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'  
    #set、dict类内部结构使用hash算法,遇到不可用hash算法类型入参即报错(unhashable)如list.
    
    list/tuple/dict类均试验通过,唯独str解释不了,待查
    >>> s=set([1,2])
    >>> s
    {1, 2}
    >>> s.update('3,a,[4,5]')
    >>> s
    {1, 2, 'a', '4', '5', '[', '3', ']', ','}
    #貌似update对入参type是str时,将其内部一切视为元素并打散,把[、]、逗号都认成元素.而当入参type是list、tuple却不会。
    

    删除=s.discard(),s.pop(),s.remove() #del不支持set

    >>> s={'Python','Java','C','C++','JavaScript','C#','Ruby','PHP','Objective-C'}
    >>> s.remove('Java')
    >>> s.remove('hello')     # remove() 入参不存在则报错
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    
    >>> s.discard('hello')      #discard()入参不存在也不报错
    >>>  
    
    >>> s.pop()     #pop()禁入参,随机删除并返回元素
    'Ruby'
    >>> s
    {'C#', 'C++', 'Objective-C', 'PHP', 'C', 'Python', 'JavaScript'}
    

    s.clear()清空set

    >>> s
    {'C#', 'C++', 'Objective-C', 'PHP', 'C', 'Python', 'JavaScript'}
    >>> s.clear()
    >>> s
    set()
    

    copy、issubset等等set函数用help(set.xx)查询语法规则,用dir(set)查询函数

    5.set作为数学应用的函数&操作符方法

    1.测试单个元素在集合内是否存在: inornot in

    >>> s={1,2,3,4,5,'a','b','m','n'}
    >>> 1 in s
    True
    >>> 7 in s
    False
    >>> 'c' not in s
    True
    
    

    2.测试两个集合是否包含,子集操作:``issubset/issuperset

    issubset=测试目标set是否包含于入参
    >>> s1={2,3}
    >>> s2={1,2,3,4,5}
    >>> s1.issubset(s2)
    True
    >>> s2.issubset(s1)
    False
    
    issuperset=测试目标set是否包含入参
    >>> s1={1,2,3,4,5}
    >>> s2={2,3}
    >>> s1.issuperset(s2)
    True
    

    3.合并两个set并返回其并集set: set.union()

    >>> s1={1,2,3,4,5}
    >>> s2={2,3,7}
    >>> s1.union(s2)             
    {1, 2, 3, 4, 5, 7}      #set为无序无重复集合,自动摒除重复元素
    >>> s3=s1.union(s2)
    >>> s3         
    {1, 2, 3, 4, 5, 7}
    ________________________________
    操作符求并集:s1|s2
    >>> s=s1|s2
    >>> s
    {1, 3, 4, 5, 6, 7}
    

    4.交集intersection()

    >>> s1={1,3,4,5,7}
    >>> s2={3,4,6}
    >>> s1.intersection(s2)
    {3, 4}
    ______________________________
    操作符求交集:s1&s2
    >>> s1&s2
    {3, 4}
    

    5.其他:difference() 相当于'差集'运算符

    >>> s1={1,2,3,4,5}
    >>> s2={2,4,6,8}
    >>> s1.difference(s2)   #s1中异于s2的元素集合
    {1, 3, 5}
    ______________________________
    #difference()=s1-s2  (差集操作符):相当于s1中减去s1&s2
    >>> s1-s2
    {1, 5, 7}
    

    symmetric_difference():对称差集

    >>> s1={1,2,3,4,5}
    >>> s2={2,4,6,8}
    >>> s1.symmetric_difference(s2)
    {1, 3, 5, 6, 8}
    _____________________________
    操作符:s1^s2  #对称差集,相当于s1|s2-s1&s2
    >>> s1^s2
    {1, 3, 5, 6, 8}
    
    目标 函数 操作符 解释
    x ⊆ y x.issubset(y)
    x ⊇ y x.issuperset(y)
    并集∪ x.union(y) x|y
    交集∩ x.intersection(y) x&y
    差集 x.difference(y) x-y x-x&y
    对称差集 x.symmentric_difference(y) x^y x|y-x&y

    6.set遍历

    #基本遍历法同list 
    s={1, 2, 'd', 'a', '4', 'c', '5'}   
    for i in s:         
    	print(i)
    ______________________________	
    #idx表示集合中元素i的索引
    s={1, 2, 'd', 'a', '4', 'c', '5'}
    for idx, i in enumerate(s):
    	print(idx,i)
    

    7. frozenset([iterable]) 冻结集合(元素不可变)

    #区别于set,frozenset无法用s={}创建
    >>> frozenset(['a','b','c'])
    frozenset({'a', 'b', 'c'})
    

    PS.关于set的几个陷阱

    1.数学应用时的左右数比较结果'格式'set | ^ & frozenset

    #当左右set类型不一致,结果格式以‘左’为准
    >>> s={1,2,3,4,5,6}
    >>> f=frozenset([1,3,5])
    >>> s|f
    {1, 2, 3, 4, 5, 6} 
    >>> s&f
    {1, 3, 5}
    >>> s^f
    {2, 4, 6}   #几个运算符的结果全为set
    
    #同样的运算过程,结果'格式'完全不同
    >>> f|s
    frozenset({1, 2, 3, 4, 5, 6})
    >>> f&s
    frozenset({1, 3, 5})
    >>> f^s
    frozenset({2, 4, 6})
    
  • 相关阅读:
    sublime3快捷键汇总
    css3百叶窗轮播图效果
    分页特效
    百度评分标准
    兼容问题汇总
    随机彩票
    js 时间函数 及相关运算大全
    JS贪吃蛇游戏
    《Vim实用技巧》阅读笔记 --- 移动及跳转
    《深入理解Linux网络技术内幕》阅读笔记 --- 路由基本概念
  • 原文地址:https://www.cnblogs.com/deepblue775737449/p/7812046.html
Copyright © 2011-2022 走看看