#!/usr/bin/env python # coding: utf-8 # # 集合 # 之前看到的列表和字符串都是一种有序序列,而集合 `set` 是一种无序的序列。 # # 因为集合是无序的,所以当集合中存在两个同样的元素的时候,Python只会保存其中的一个(唯一性);同时为了确保其中不包含同样的元素,集合中放入的元素只能是不可变的对象(确定性)。 # ## 集合生成 # 可以用`set()`函数来显示的生成空集合: # In[1]: a = set() type(a) # 也可以使用一个列表来初始化一个集合: # In[2]: a = set([1, 2, 3, 1]) a # 集合会自动去除重复元素 `1`。 # 可以看到,集合中的元素是用大括号`{}`包含起来的,这意味着可以用`{}`的形式来创建集合: # In[3]: a = {1, 2, 3, 1} a # 但是创建空集合的时候只能用`set`来创建,因为在Python中`{}`创建的是一个空的字典: # In[4]: s = {} type(s) # ## 集合操作 # 假设有这样两个集合: # In[5]: a = {1, 2, 3, 4} b = {3, 4, 5, 6} # ### 并 # 两个集合的并,返回包含两个集合所有元素的集合(去除重复)。 # # 可以用方法 `a.union(b)` 或者操作 `a | b` 实现。 # In[6]: a.union(b) # In[7]: b.union(a) # In[8]: a | b # ### 交 # 两个集合的交,返回包含两个集合共有元素的集合。 # # 可以用方法 `a.intersection(b)` 或者操作 `a & b` 实现。 # In[9]: a.intersection(b) # In[10]: b.intersection(a) # In[11]: a & b # In[12]: print(a & b) # 注意:一般使用print打印set的结果与表示方法并不一致。 # ### 差 # `a` 和 `b` 的差集,返回只在 `a` 不在 `b` 的元素组成的集合。 # # 可以用方法 `a.difference(b)` 或者操作 `a - b` 实现。 # In[13]: a.difference(b) # In[14]: a - b # 注意,`a - b` 与 `b - a`并不一样,`b - a` 返回的是返回 b 不在 a 的元素组成的集合: # In[15]: b.difference(a) # In[16]: b - a # ### 对称差 # `a` 和`b` 的对称差集,返回在 `a` 或在 `b` 中,但是不同时在 `a` 和 `b` 中的元素组成的集合。 # # 可以用方法 `a.symmetric_difference(b)` 或者操作 `a ^ b` 实现(异或操作符)。 # In[17]: a.symmetric_difference(b) # In[18]: b.symmetric_difference(a) # In[19]: a ^ b # ### 包含关系 # 假设现在有这样两个集合: # In[20]: a = {1, 2, 3} b = {1, 2} # 要判断 `b` 是不是 `a` 的子集,可以用 `b.issubset(a)` 方法,或者更简单的用操作 `b <= a` : # In[21]: b.issubset(a) # In[22]: b <= a # 与之对应,也可以用 `a.issuperset(b)` 或者 `a >= b` 来判断: # In[23]: a.issuperset(b) # In[24]: a >= b # 方法只能用来测试子集,但是操作符可以用来判断真子集: # In[25]: a <= a # 自己不是自己的真子集: # In[26]: a < a # ## 集合方法 # ### `add` 方法向集合添加单个元素 # 跟列表的 `append` 方法类似,用来向集合添加单个元素。 # # s.add(a) # # 将元素 `a` 加入集合 `s` 中。 # In[27]: t = {1, 2, 3} t.add(5) t # 如果添加的是已有元素,集合不改变: # In[28]: t.add(3) t # ### `update` 方法向集合添加多个元素 # 跟列表的`extend`方法类似,用来向集合添加多个元素。 # # s.update(seq) # # 将`seq`中的元素添加到`s`中。 # In[29]: t.update([5, 6, 7]) t # ### `remove` 方法移除单个元素 # s.remove(ob) # # 从集合`s`中移除元素`ob`,如果不存在会报错。 # In[30]: t.remove(1) t # In[31]: t.remove(10) # ### pop方法弹出元素 # 由于集合没有顺序,不能像列表一样按照位置弹出元素,所以`pop` 方法删除并返回集合中任意一个元素,如果集合中没有元素会报错。 # In[32]: t.pop() # In[33]: print t # In[34]: s = set() # 报错 s.pop() # ### discard 方法 # 作用与 `remove` 一样,但是当元素在集合中不存在的时候不会报错。 # In[35]: t.discard(3) # In[36]: t # 不存在的元素不会报错: # In[37]: t.discard(20) # In[38]: t # ### difference_update方法 # a.difference_update(b) # # 从a中去除所有属于b的元素: