集合(2)
Then Jesus came up and said to them, "All authority in heaven and on earth has been given to me. Therefore go and make disciples of all nations, baptizing them in the name of the Father and the Son and the Holy Spirit, teaching them to obey everything I have commanded you. And remember, I am with you always, to the end of the age." (MATTHEW 28:18-20)
集合(2)
不变的集合
《集合(1)》中以set()
来建立集合,这种方式所创立的集合都是可原处修改的集合,或者说是可变的,也可以说是unhashable
还有一种集合,不能在原处修改。这种集合的创建方法是用frozenset()
,顾名思义,这是一个被冻结的集合,当然是不能修改了,那么这种集合就是hashable类型——可哈希。
>>> f_set = frozenset("qiwsir")>>> f_setfrozenset(['q', 'i', 's', 'r', 'w'])>>> f_set.add("python") Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'frozenset' object has no attribute 'add'
报错。“不求成功,但求报错”。从提示信息中可知,这种集合不能修改。
对比看一看,也是复习。这是一个可以原处修改的集合。
>>> a_set = set("github") >>> a_setset(['b', 'g', 'i', 'h', 'u', 't'])>>> a_set.add("python")>>> a_setset(['b', 'g', 'i', 'h', 'python', 'u', 't'])
集合运算
唤醒一下中学数学中关于集合的一点知识,当然,你如果是某个理工科的专业大学毕业,更应该熟悉集合之间的关系。
元素与集合的关系
只有一种关系。
元素要么属于某个集合,要么不属于。
>>> aset = set(['h', 'o', 'n', 'p', 't', 'y'])>>> "a" in asetFalse>>> "h" in asetTrue
集合与集合的关系
假设两个集合A、B
- A是否等于B,即两个集合的元素是否完全一样
在交互模式下实验
>>> a = set(['q', 'i', 's', 'r', 'w'])>>> b = set(['a', 'q', 'i', 'l', 'o'])>>> a == bFalse>>> a != bTrue
- A是否是B的子集,或者反过来,B是否是A的超集。即A的元素也都是B的元素,但是B的元素比A的元素数量多。
判断集合A是否是集合B的子集,可以使用A<B
,返回true则是子集,否则不是。另外,还可以使用函数A.issubset(B)
判断。
>>> a = set(['q', 'i', 's', 'r', 'w'])>>> c = set(['q', 'i'])>>> c < a #c是a的子集True>>> c.issubset(a) #或者用这种方法,判断c是否是a的子集True>>> a.issuperset(c) #判断a是否是c的超集True>>> b = set(['a', 'q', 'i', 'l', 'o'])>>> a < b #a不是b的子集False>>> a.issubset(b) #或者这样做False
- A、B的并集,即A、B所有元素,如下图所示
可以使用的符号是“|”,是一个半角状态写的竖线,输入方法是在英文状态下,按下"shift"加上右方括号右边的那个键。找找吧。表达式是A | B
.也可使用函数A.union(B)
,得到的结果就是两个集合并集,注意,这个结果是新生成的一个对象,不是将结合A扩充。
>>> a = set(['q', 'i', 's', 'r', 'w'])>>> b = set(['a', 'q', 'i', 'l', 'o'])>>> a | b #可以有两种方式,结果一样set(['a', 'i', 'l', 'o', 'q', 's', 'r', 'w']) #Python 3:{'q', 'w', 'r', 'l', 's', 'a', 'o', 'i'}>>> a.union(b)set(['a', 'i', 'l', 'o', 'q', 's', 'r', 'w']) #Python 3同上
- A、B的交集,即A、B所公有的元素,如下图所示
>>> a = set(['q', 'i', 's', 'r', 'w'])>>> b = set(['a', 'q', 'i', 'l', 'o'])>>> a & b #两种方式,等价set(['q', 'i']) #Python 3: {'q', 'i'}>>> a.intersection(b)set(['q', 'i']) #Python 3同上
我在实验的时候,顺手敲了下面的代码,出现的结果如下,能解释一下吗?(思考题)
>>> a and bset(['a', 'q', 'i', 'l', 'o']) #Python 3:{'q', 'l', 'a', 'o', 'i'}
- A相对B的差(补),即A相对B不同的部分元素,如下图所示
>>> a = set(['q', 'i', 's', 'r', 'w'])>>> b = set(['a', 'q', 'i', 'l', 'o'])>>> a - bset(['s', 'r', 'w']) #Python 3: {'r', 's', 'w'}>>> a.difference(b)set(['s', 'r', 'w']) #Python 3同上
-A、B的对称差集,如下图所示
>>> a = set(['q', 'i', 's', 'r', 'w'])>>> b = set(['a', 'q', 'i', 'l', 'o'])>>> a.symmetric_difference(b)set(['a', 'l', 'o', 's', 'r', 'w']) #Python 3: {'w', 'r', 'l', 's', 'a', 'o'}
以上是集合的基本运算。在编程中,如果用到,可以用前面说的方法查找。不用死记硬背。