• 集合


    集合

    集合对象是一组无序排列的可哈希的值,集合成员可以做字典中的键。注意,由于集合本身是无序,你不可以为集合创建索引或执行切片操作,也没有键可用来获取集合中元素的值。
    通常对于Python的内置数据结构,list set bytearray dict 是不可hash的,所以不能作为set的元素,通常来说,内置类型,不可变类型是可hash的,可变类型是不可hash的。
    集合分为可变集合(set)和不可变集合(frozenset),对于可变集合你可以添加删除元素,对于不可变集合则不允许这么操作。

    集合的定义和使用

    集合的定义

    注意不能使用{}来定义为集合,这是由于{}默认定义为字典。

    In [1]: s = set()
    
    In [2]: type(s)
    Out[2]: set
    
    In [3]: s = {}
    
    In [4]: type(s)
    Out[4]: dict
    
    In [5]: s = {1,2,3,4}
    
    In [6]: type(s)
    Out[6]: set
    

    访问集合中的值

    In [16]: s = set('dota')
    
    In [17]: s
    Out[17]: {'a', 'd', 'o', 't'}
    
    In [18]: 'a' in s
    Out[18]: True
    
    In [19]: for i in s:
       ....:     print(i) 
    t
    d
    a
    o
    

    更新集合的元素

    • add

    • update

    In [7]: s = set('dota')
    
    In [8]: s
    Out[8]: {'a', 'd', 'o', 't'}
    
    In [9]: t = frozenset('dota')
    
    In [10]: t
    Out[10]: frozenset({'a', 'd', 'o', 't'})
    
    In [11]: type(s)
    Out[11]: set
    
    In [12]: type(t)
    Out[12]: frozenset
    
    In [13]: s.add('er')
    
    In [14]: s
    Out[14]: {'a', 'd', 'er', 'o', 't'}
    
    In [15]: t.
    t.copy                  t.difference            t.intersection          t.isdisjoint            t.issubset              t.issuperset            t.symmetric_difference  t.union
    
    In [23]: s.add('er')
    
    In [24]: s
    Out[24]: {'a', 'd', 'er', 'o', 't'}
    
    In [5]: s.add('a')
    
    In [6]: s
    Out[6]: {'a', 'd', 'er', 'o', 't'}
    
    In [7]: s.update(('e','r'))
    
    In [8]: s
    Out[8]: {'a', 'd', 'e', 'er', 'o', 'r', 't'}
    
    In [9]: s.update(['i','b'])
    
    In [10]: s
    Out[10]: {'a', 'b', 'd', 'e', 'er', 'i', 'o', 'r', 't'}
    
    In [11]: s.update({'d','z'})
    
    In [12]: s
    Out[12]: {'a', 'b', 'd', 'e', 'er', 'i', 'o', 'r', 't', 'z'}
    
    

    通过上面的举例我们可以得出:

    • frozenset是不可变集合不能更改集合内的元素。

    • 可变集合中add方法只能添加一个元素,并且添加的元素是无序的。

    • 可变集合中update是添加一组元素,这组元素可以是任意个。组可以是元组、列表、可变集合。

    • 不管是add还是update添加元素一旦元素已经存在,集合不会发生任何改变。

    通过集合元素的唯一性我们可以将一个列表内的元素进行去重,但是这种方法对于元素的顺序没有什么要求。

    In [16]: lst = [2,3,4,5,2,3,4,7,5]
    
    In [17]: list(set(lst))
    Out[17]: [2, 3, 4, 5, 7]
    

    删除集合的元素

    • remove

    • discard

    • pop

    • clear

    In [18]: s
    Out[18]: {'a', 'b', 'd', 'e', 'er', 'i', 'o', 'r', 't', 'z'}
    
    In [19]: s.remove('a')
    
    In [20]: s
    Out[20]: {'b', 'd', 'e', 'er', 'i', 'o', 'r', 't', 'z'}
    
    In [22]: s.discard('g')
    
    In [23]: s.discard('o')
    
    In [24]: s
    Out[24]: {'b', 'd', 'e', 'er', 'i', 'r', 't', 'z'}
    
    In [25]: s.pop()
    Out[25]: 'b'
    
    In [26]: s
    Out[26]: {'d', 'e', 'er', 'i', 'r', 't', 'z'}
    
    In [28]: s.clear()
    
    In [29]: s
    Out[29]: set()
    
    • remove和discard都是删除指定元素。两者的区别是remove删除若是集合没有元素会报KeyError的错误,而discard则不会报错。

    • pop是删除任意的元素

    • clear是清除集合所有的元素

    集合的集合运算

    • s.union(t):返回一个新集合,该集合是s和t的并集

    • s.intersection(t):返回一个新集合,该集合是s和t的交集

    • s.difference(t):返回一个新集合该集合是s的成员,但不是t的成员

    • s.symmetric_difference(t):返回一个新集合,该集合是s或t的成员,但不是s和t共有的成员

    In [30]: s1 = {1,2,3,4,5}
    
    In [31]: s2 = {2,4,5,6,7}
    
    In [32]: s1.union(s2)
    Out[32]: {1, 2, 3, 4, 5, 6, 7}
    
    In [33]: s1.intersection(s2)
    Out[33]: {2, 4, 5}
    
    In [34]: s1.difference(s2)
    Out[34]: {1, 3}
    
    In [35]: s2.difference(s1)
    Out[35]: {6, 7}
    
    In [36]: s1.symmetric_difference(s2)
    Out[36]: {1, 3, 6, 7}
    
    
    • s.issuperset(t):如果t是s的超集,则返回True,否则返回False

    • s.issubset(t):如果s是t的子集则返回True,否则返回False

    • s.isdisjoint(t):如果s与t不相交则返回True,否则返回False

    In [45]: s
    Out[45]: {2, 3}
    
    In [46]: s1
    Out[46]: {1, 2, 3, 4, 5}
    
    In [48]: s.issubset(s1)
    Out[48]: True
    
    In [49]: s.issuperset(s1)
    Out[49]: False
    
    In [50]: s1.issuperset(s)
    Out[50]: True
    
    In [53]: s = set([8])
    
    In [54]: s
    Out[54]: {8}
    
    In [55]: s.isdisjoint(s1)
    Out[55]: True
    
    • s.difference_update(t):s中的成员是属于s但不包含在t中的元素

    • s.intersection_update(t):s中的成员是共同属于s和t的元素

    • s.symmetric_difference_update(t):s中的成员更新为那些包含在s或t中,但不是s和t共有的元素

    In [58]: s1
    Out[58]: {1, 2, 3, 4, 5}
    
    In [59]: s2
    Out[59]: {2, 4, 5, 6, 7}
    
    In [60]: s1.intersection_update(s2)
    
    In [61]: s2
    Out[61]: {2, 4, 5, 6, 7}
    
    In [62]: s1
    Out[62]: {2, 4, 5}
    
    In [63]: s1.difference_update(s2)
    
    In [64]: s1
    Out[64]: set()
    
    In [65]: s2
    Out[65]: {2, 4, 5, 6, 7}
    
    In [66]: s1.symmetric_difference_update(s2)
    
    In [67]: s1
    Out[67]: {2, 4, 5, 6, 7}
    
    In [68]: s2
    Out[68]: {2, 4, 5, 6, 7}
    

    集合的操作符

    方法名等价操作符说明
    s.issubset(t) s <= t 子集测试:s中所有的元素都是t的成员
    s.issubset(t) s >= t 超集测试:t中所有的元素都是s的成员
    s.union(t) s | t 合并操作:s或t中的元素
    s.intersection(t) s & t 交集操作:s和t中的元素
    s.difference(t) s - t 差分操作:s中的元素,而不是t中的元素
    s.symmetric_difference(t) s ^ t 对称差分操作:s或t中的元素,但不是s和t共有的元素
    s.intersection_update(t) s &= t 交集修改操作:s中包括s和t中共有的成员
    s.difference_update(t) s -= t 差分修改操作:s中包括仅属于s但不属于t的成员
    s.symmetric_difference_update(t) s ^= t 对称差分修改操作:s中包括仅属于s或仅属于t的成员
  • 相关阅读:
    记录未完成
    java8时间有关新特性
    《java多线程编程核心技术》----simpleDateFormat非线程安全
    基于JavaScript的表格设计:按序添加或删除班级的学生信息
    BOOK
    Android攻城狮Dialog
    Android攻城狮重新认识Toast
    Android攻城狮使用LogCat方式调试程序
    Android攻城狮属性动画赏析
    Android攻城狮布局动画
  • 原文地址:https://www.cnblogs.com/cuchadanfan/p/5926070.html
Copyright © 2020-2023  润新知