zoukankan      html  css  js  c++  java
  • 集合

    集合

    集合对象是一组无序排列的可哈希的值,集合成员可以做字典中的键。注意,由于集合本身是无序,你不可以为集合创建索引或执行切片操作,也没有键可用来获取集合中元素的值。
    通常对于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的成员
  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1036. Boys vs Girls (25)
    1035 Password (20)
    1027 Colors in Mars (20)
    1009. Product of Polynomials (25)
    1006. Sign In and Sign Out
    1005 Spell It Right (20)
    1046 Shortest Distance (20)
    ViewPager页面滑动,滑动到最后一页,再往后滑动则执行一个事件
    IIS7.0上传文件限制的解决方法
  • 原文地址:https://www.cnblogs.com/cuchadanfan/p/5926070.html
Copyright © 2011-2022 走看看