2、集合类型
数学上,把set称做由不同的元素组成的集合,集合(set)的成员通常被称做集合元素(set elements)。
Python把这个概念引入到它的集合类型对象里。Python中集合(sets)有两种不同的类型:可变集合(set)和不可变集合(frozenset)。对可变集合(set),可以添加和删除元素,对不可变集合(frozenset)则不允许这样做。
注意:集合类型是无序,不可重复的。可变集合(set)不是可哈希的,因此既不能用做字典的键也不能做其他集合中的元素。不可变集合(frozenset)则正好相反,即它们有哈希值,能被用做字典的键或是作为集合中的一个成员。
(1)集合类型的创建
集合类型是无序,不可重复的。 set()和 frozenset()工厂函数分别用来生成可变和不可变的集合。如果不提供任何参数,默认会生成空集合。如果提供一个参数,则该参数必须是可迭代的,如:set(iterable) -> new set object 其中iterable可以是String、List、Tuple、Dictionary。但是为dict时,只会获取提Key作为set的元素。
>>> s = set() >>> type(s) <class 'set'> >>> a = set('python') >>> a {'y', 'o', 't', 'n', 'p', 'h'} >>> b = set([2,4,3,7]) >>> b {2, 3, 4, 7} >>> c= frozenset({1:'p',2:'y',3:'t'}) >>> c frozenset({1, 2, 3}) >>> a = set([1,2,1,3]) >>> a {1, 2, 3} >>> b = frozenset([1,2,1,3]) >>> b frozenset({1, 2, 3}) >>>
(2)集合类型操作符
obj in s |
成员测试:obj 是 s 中的一个元素吗? |
obj not in s |
非成员测试:obj 不是 s 中的一个元素吗? |
s == t |
等价测试: 测试 s 和 t 是否具有相同的元素? |
s != t |
不等价测试: 与==相反 |
s < t |
(严格意义上)子集测试; s != t 而且 s 中 所 有 的元素都是 t 的成员 |
s <= t |
子集测试(允许不严格意义上的子集): s 中所有的元素都是 t 的成员 |
s > t |
(严格意义上)超集测试: s != t 而且 t 中所有的元素都是 s 的成员 |
s >= t |
超集测试(允许不严格意义上的超集): t 中所有的元素 都是 s 的成员 |
s | t |
合并操作: s 或 t 中的元素 |
s & t |
交集操作: s 和 t 中的元素 |
s - t |
差分操作: s 中的元素,而不是 t 中的元素 |
s ^ t |
对称差分操作:s 或 t 中的元素,但不是 s 和 t 共有的元素 |
(3)集合内置方法
len(s) |
集合基数: 集合 s 中元素的个数 |
set([obj]) |
可变集合工厂函数; obj 必须是支持迭代的,由 obj 中的元素创建集合,否则创建一个空集合 |
frozenset([obj]) |
不可变集合工厂函数; 执行方式和 set()方法相同,但它返回的是不可变集合 |
s.issubset(t) |
即s <= t, 子集测试(允许不严格意义上的子集): s 中所有的元素都是 t 的成员 |
s.issuperset(t) |
即s >= t ,超集测试(允许不严格意义上的超集): t 中所有的元素 都是 s 的成员 |
s.isdisjoint(t) |
判断是否有交集, 如果没有交集,返回True,否则返回False |
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.copy() |
复制操作:返回 s 的(浅复制)副本 |
(4)set(可变集合)的内置方法
class set(object): """ set() -> new empty set object set(iterable) -> new set object Build an unordered collection of unique elements. """ def add(self, *args, **kwargs): # real signature unknown """ Add an element to a set,添加元素 This has no effect if the element is already present. """ pass def clear(self, *args, **kwargs): # real signature unknown """ Remove all elements from this set. 清楚内容""" pass def copy(self, *args, **kwargs): # real signature unknown """ Return a shallow copy of a set. 浅拷贝 """ pass def difference(self, *args, **kwargs): # real signature unknown """ Return the difference of two or more sets as a new set. A中存在,B中不存在 (i.e. all elements that are in this set but not the others.) """ pass def difference_update(self, *args, **kwargs): # real signature unknown """ Remove all elements of another set from this set. 从当前集合中删除和B中相同的元素""" pass def discard(self, *args, **kwargs): # real signature unknown """ Remove an element from a set if it is a member. If the element is not a member, do nothing. 移除指定元素,不存在不保错 """ pass def intersection(self, *args, **kwargs): # real signature unknown """ Return the intersection of two sets as a new set. 交集 (i.e. all elements that are in both sets.) """ pass def intersection_update(self, *args, **kwargs): # real signature unknown """ Update a set with the intersection of itself and another. 取交集并更更新到A中 """ pass def isdisjoint(self, *args, **kwargs): # real signature unknown """ Return True if two sets have a null intersection. 如果没有交集,返回True,否则返回False""" pass def issubset(self, *args, **kwargs): # real signature unknown """ Report whether another set contains this set. 是否是子序列""" pass def issuperset(self, *args, **kwargs): # real signature unknown """ Report whether this set contains another set. 是否是父序列""" pass def pop(self, *args, **kwargs): # real signature unknown """ Remove and return an arbitrary set element. Raises KeyError if the set is empty. 移除元素 """ pass def remove(self, *args, **kwargs): # real signature unknown """ Remove an element from a set; it must be a member. If the element is not a member, raise a KeyError. 移除指定元素,不存在保错 """ pass def symmetric_difference(self, *args, **kwargs): # real signature unknown """ Return the symmetric difference of two sets as a new set. 对称交集 (i.e. all elements that are in exactly one of the sets.) """ pass def symmetric_difference_update(self, *args, **kwargs): # real signature unknown """ Update a set with the symmetric difference of itself and another. 对称交集,并更新到a中 """ pass def union(self, *args, **kwargs): # real signature unknown """ Return the union of sets as a new set. 并集 (i.e. all elements that are in either set.) """ pass def update(self, *args, **kwargs): # real signature unknown """ Update a set with the union of itself and others. 更新 """ pass
s.add(obj) |
加操作: 将 obj 添加到 s |
s.update(t) |
s |= t (Union) 修改操作: 将 t 中的成员添加 s |
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 的成员 |
s.remove(obj) |
删除操作: 将 obj 从 s 中删除;如果 s 中不存在obj,将引发 KeyError |
s.discard(obj) |
丢弃操作: remove() 的 友 好 版 本 - 如果 s 中存在 obj,从 s 中删除它 |
s.pop() |
Pop 操作: 移除并返回 s 中的任意一个元素 |
s.clear() |
清除操作: 移除 s 中的所有元素 |