您的位置:首页 > 编程语言 > Python开发

python 集合类型

2017-08-20 14:51 232 查看

集合

数学上, 把 set 称做由不同的元素组成的集合,集合(set)的成员通常被称做集合元素(setelements)。Python 把这个概念引入到它的集合类型对象里。集合对象是一组无序排列的可哈希的值,集合成员可以做字典中的键。和其他容器类型一样,集合支持用 in 和 not in 操作符检查成员, 由 len() 内建函数得到集合的基数(大小), 用 for 循环迭代集合的成员。但是因为集合本身是无序的,你不可以为集合创建索引或执行切片(slice)操作,也没有键(keys)可用来获取集合中元素的值。集合(sets)有两种不同的类型,可变集合(set) 和 不可变集合(frozenset)。如你所想,对可变集合(set),你可以添加和删除元素,对 不可变集合(frozenset)则不允许这样做。请注意,可变集合(set)不是可哈希的,因此既不能用做字典的键也不能做其他集合中的元素。不可变集合(frozenset)则正好相反,即,他们有哈希值,能被用做字典的键或是作为集合中的一个成员。

python中的集合

集合被创建的唯一方法 - 用集合的工厂方法 set()(可变集合)和 frozenset()(不可变集合):

1.创建集合类型和给集合赋值

>>> s = set('cheeseshop')
>>> s
set(['c', 'e', 'h', 'o', 'p', 's'])
>>> t = frozenset('bookshop')
>>> t
frozenset(['b', 'h', 'k', 'o', 'p', 's'])
>>> type(s)
<type 'set'>
>>> type(t)
<type 'frozenset'>
>>> len(s)
6
>>> len(s) == len(t)
True
>>> s == t
False


2.访问集合中的值

>>> 'k' in s
False
>>> 'k' in t
True
>>> 'c' not in t
True
>>> for i in s:
... print(i)
...
c
e
h
o
p
s


3.更新集合

可以使用各种集合内建的方法和操作符添加和删除集合的成员:

>>> s.add('z')
>>> s
set(['c', 'e', 'h', 'o', 'p', 's', 'z'])
>>> s.update('pypi')
>>> s
set(['c', 'e', 'i', 'h', 'o', 'p', 's', 'y', 'z'])
>>> s.remove('z')
>>> s
set(['c', 'e', 'i', 'h', 'o', 'p', 's', 'y'])
>>> s -= set('pypi')
>>> s
set(['c', 'e', 'h', 'o', 's'])


只有可变集合能被修改。试图修改不可变集合会引发异常。

>>> t.add('z')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: 'frozenset' object has no attribute 'add'


4.删除集合中的成员和集合

前面我们看到如何删除集合成员。如果想要删除集合本身,可以像删除任何 Python 对象一样,令集合超出它的作用范围, 或调用 del 将他们直接清除出当前的名字空间。 如果它的引用计数为零,也会被标记以便被垃圾回收。

>>> del s
>>>


集合类型操作符

1.标准类型操作符(适用于所有集合类型)

in 和 not in 操作符判断某个元素是否是一个集合中的成员。

>>> s = set('cheeseshop')
>>> t = frozenset('bookshop')
>>> 'k' in s
False
>>> 'k' in t
True
>>> 'c' not in t
True


==/!=被用于在相同或不同的集合之间做比较。两个集合相等是指,对每个集合而言,当且仅当其中一个集合中的每个成员同时也是另一个集合中的成员。

>>> s == t
False
>>> s != t
True
>>> u = frozenset(s)
>>> s == u
True
>>> set('posh') == set('shop')
True


Sets 用 Python 的比较操作符检查某集合是否是其他集合的超集或子集。“小于”符号( <, <= )用来判断子集,“大于”符号( >, >= )用来判断超集。“小于” 和 “大于”意味着两个集合在比较时不能相等。等于号允许非严格定义的子集和超集。Sets 支持严格( < )子集和非严格 ( <= ) 子集, 也支持严格( > )超集和非严格 ( >= )超集。只有当第一个集合是第二个集合的严格子集时,我们才称第一个集合“小于”第二个集合,同理,只有当第一个集合是第二个集合的严格超集时,我们才称第一个集合“大于”第二个集合。

>>> set('shop') < set('cheeseshop')
True
>>> set('bookshop') >= set('shop')
True


两个集合的联合是一个新集合,该集合中的每个元素都至少是其中一个集合的成员,即,属于两个集合其中之一的成员。联合符号有一个等价的方法,union()。

>>> s | t
set(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])


两个集合的交集是一个新集合,该集合中的每个元素同时是两个集合中的成员,即,属于两个集合的成员。交集符号有一个等价的方法,

intersection().

>>> s & t
set(['h', 's', 'o', 'p']


两个集合(s 和 t)的差补或相对补集是指一个集合 C,该集合中的元素,只属于集合 s,而不属于集合 t。差符号有一个等价的方法,difference().

>>> s - t
set(['c', 'e'])


两个集合(s 和 t)的对称差分是指另外一个集合 C,该集合中的元素,只能是属于集合 s 或者集合 t的成员,不能同时属于两个集合。对称差分有一个等价的方法,symmetric_difference().

>>> s ^ t
set(['k', 'b', 'e', 'c'])


2.集合类型操作符(仅适用于可变集合)

Update ( |= )

这个更新方法从已存在的集合中添加(可能多个)成员,此方法和 update()等价。

>>> s = set('cheeseshop')
>>> u = frozenset(s)
>>> s |= set('pypi')
>>> s
set(['c', 'e', 'i', 'h', 'o', 'p', 's', 'y'])


保留/交集更新( &= )

保留(或交集更新)操作保留与其他集合的共有成员。此方法和 intersection_update()等价。

>>> s = set(u)
>>> s &= set('shop')
>>> s
set(['h', 's', 'o', 'p'])


差更新 ( –= )

对集合 s 和 t 进行差更新操作 s-=t,差更新操作会返回一个集合,该集合中的成员是集合 s 去除掉集合 t 中元素后剩余的元素。此方法和 difference_update()等价

>>> s = set('cheeseshop')
>>> s -= set('shop')
>>> s
set(['c', 'e'])


对称差分更新( ^= )

对集合 s 和 t 进行对称差分更新操作(s^=t),对称差分更新操作会返回一个集合,该集合中的成

员仅是原集合 s 或仅是另一集合 t 中的成员。此方法和 symmetric_difference_update()等价.

>>> s = set('cheeseshop')
>>> t = frozenset('bookshop')
>>> s ^= t
>>> s
set(['c', 'b', 'e', 'k'])


集合方法

内建方法 copy() 没有等价的操作符。和同名的字典方法一样,copy()方法比用像 set(),frozenset(), 或 dict()这样的工厂方法复制对象的副本要快。

方法名称说明
s.issubset(t)如果 s 是 t 的子集,则返回 True,否则返回 False
s.issuperset(t)如果 t 是 s 的超集,则返回 True,否则返回 False
s.union(t)返回一个新集合,该集合是 s 和 t 的并集
s.intersection(t)返回一个新集合,该集合是 s 和 t 的交集
s.difference(t)返回一个新集合,该集合是 s 的成员,但不是 t 的成员
s.symmetric_difference(t)返回一个新集合,该集合是 s 或 t 的成员,但不是 s 和 t 共有的成员
s.copy()返回一个新集合,它是集合 s 的浅复制
下面是一些仅适用于可变集合类型的方法

方法名称说明
s.update(t)用 t 中的元素修改 s, 即,s 现在包含 s 或 t 的成员
s.intersection_update(t)s 中的成员是共同属于 s 和 t 的元素。
s.difference_update(t)s 中的成员是属于 s 但不包含在 t 中的元素
s.symmetric_difference_update(t)s 中的成员更新为那些包含在 s 或 t 中,但不 是 s和 t 共有的元素
s.add(obj)在集合 s 中添加对象 obj
s.remove(obj)从集合 s 中删除对象 obj;如果 obj 不是集合 s 中的元素(obj notin s),将引发 KeyError 错误
s.discard(obj)如果 obj 是集合 s 中的元素,从集合 s 中删除对象 obj;
s.pop()删除集合 s 中的任意一个对象,并返回它
s.clear()删除集合 s 中的所有元素
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: