python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素。 集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)等数学运算。
sets 支持 x in set的bool运算判别x是否在集合内, len(set)集合的长度,和 for x in set对集合内数据的操作。作为一个无序的集合,sets不记录元素位置或者插入点。因此,sets**不支持 indexing, slicing**, 或其它类序列(sequence-like)的操作。
集合用于包含一组无序的对象。要创建集合,可使用set()函数并像下面这样提供一系列的项:
In [1]: s = set([3,5,9,10]) #创建一个数值集合
In [2]: t = set("Hello") #创建一个唯一字符的集合
与列表和元组不同,集合是无序的,也无法通过数字进行索引。此外,集合中的元素不能重复。例如,如果检查前面代码中t集合的值,结果会是:
In [3]: t
Out[3]: {'H', 'e', 'l', 'o'}
集合支持一系列标准操作,包括并集、交集、差集和对称差集,例如:
- a = t | s # t 和 s的并集
- b = t & s # t 和 s的交集
- c = t – s # 求差集(项在t中,但不在s中)
- d = t ^ s #对称差集(项在t或s中,但不会同时出现在二者中)
基本操作:
1、添加新的元素,.add()用于添加单个元素、.update()用于批量添加元素,如果喂给add的是‘avda’这种多字符串可以成为一个元素,但是喂给update会对字符串去重操作
In [4]: t.add('x')
In [5]: t
Out[5]: {'H', 'e', 'l', 'o', 'x'}
In [6]: t.update('aa','bbb')
In [7]: t
Out[7]: {'H', 'a', 'b', 'e', 'l', 'o', 'x'}
In [9]: t.add('ccc')
In [10]: t
Out[10]: {'H', 'a', 'b', 'ccc', 'e', 'l', 'o', 'x'}
2、使用remove()可以删除一项,只能一个一个删掉
In [12]: t.remove('H')
In [13]: t
Out[13]: {'a', 'b', 'ccc', 'e', 'l', 'o', 'x'}
3、集合长度
In [15]: len(t)
Out[15]: 7
4、bool判断
#x in s 测试 x 是否是 s 的成员
In [16]: 'a' in t
Out[16]: True
#x not in s 测试 x 是否不是 s 的成员
In [17]: 'k' not in t
Out[17]: True
#s.issubset(t),s <= t 测试是否s中的每一个元素都在t中
In [18]: s.issubset(t)
Out[18]: False
#s.issuperset(t),s >= t测试是否t中的每一个元素都在s中
In [19]: s.issuperset(t)
Out[19]: False
5、交集(&)、(intersection)项同时在t与s中
In [20]: s&t
Out[20]: set()
In [22]: s.intersection(t)
Out[22]: set()
6、并集(|)、(union),项在t中或者在s中
In [23]: s|t
Out[23]: {'a', 3, 5, 'ccc', 'e', 9, 10, 'l', 'o', 'x', 'b'}
In [21]: s.union(t)
Out[21]: {'a', 3, 5, 'ccc', 'e', 9, 10, 'l', 'o', 'x', 'b'}
7、差集(-)、(difference),项在s中,但不在t中
In [24]: s-t
Out[24]: {3, 5, 9, 10}
In [25]: s.difference(t)
Out[25]: {3, 5, 9, 10}
8、对称差集(^)、(sysmmetric_difference),项在t或s中,但不会同时出现在二者中
In [26]: s^t
Out[26]: {'a', 3, 5, 9, 10, 'o', 'x', 'ccc', 'e', 'l', 'b'}
In [27]: s.symmetric_difference(t)
Out[27]: {'a', 3, 5, 9, 10, 'o', 'x', 'ccc', 'e', 'l', 'b'}
请注意:union(), intersection(), difference() 和 symmetric_difference() 的非运算符(non-operator,就是形如 s.union()这样的)版本将会接受任何 iterable 作为参数。相反,它们的运算符版本(operator based counterparts)要求参数必须是 sets,如果都是set会报错。
In [29]: set('abc') & 'cbs'
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-29-2548e5075caf> in <module>()
----> 1 set('abc') & 'cbs'
TypeError: unsupported operand type(s) for &: 'set' and 'str'
#如果是非运算符,则可以;
In [28]: set('abc').intersection('cbs')
Out[28]: {'b', 'c'}