Python Set集合 定义 创建 基本方法
定义
-
Set Types-Set,frozenset -
set 对象是由具有唯一性的 hashable 对象所组成的无序多项集。常见的用途包括成员测试、从序列中删除重复项以及计算数学运算,如交集、并集、差分和对称差分 -
与其他集合一样,set 支持x in set 、len(set) 和For x in set 。集合是无序集合,不记录元素位置或插入顺序。因此,集合不支持索引、切片或其他类似序列的行为。 -
当前有两种内置的set 类型,set 和frozenset 。集合类型是可变的-可以使用add() 和remove() 等方法更改内容。因为它是可变的,所以它没有哈希值,不能用作字典键或另一个集合的元素。frozenset 类型是不可变的和可散列的-它的内容在创建之后不能被更改;因此,它可以用作字典键或另一个集合的元素。 -
除了set构造函数之外,还可以通过在大括号中放置逗号分隔的元素列表(例如:{'jack','sjoerd} )来创建非空集(不是frozensets )。 -
返回一个新的set或frozenset 对象,其元素取自iterable 。集合的元素必须是可哈希的。要表示集合的集合,内部集合必须是frozenset 对象。如果未指定iterable ,则返回一个新的空集。
创建
集合可以通过多种方式创建:
-
使用逗号分隔的大括号内元素列表:{'jack', 'sjoerd'} -
使用集合理解:{c for c in 'abracadabra' if c not in 'abc'} -
使用类型构造函数:set() ,set('foobar') ,set(['a','b','foo'])
>>> {c for c in 'abracadabra' if c not in 'abc'}
{'d', 'r'}
>>> set('foobar')
{'b', 'r', 'f', 'o', 'a'}
>>> set(['a','b','foo'])
{'b', 'foo', 'a'}
显示
- 集合显示 集合显示由大括号表示,并且由于缺少分隔键和值的冒号而与字典显示区分开来:
set_display ::= "{" (starred_list | comprehension) "}"
方法
集合操作
查看
set 和frozenset 的实例提供以下操作:
>>> a = set("fyznb")
{'z', 'b', 'n', 'f', 'y'}
>>> b = {'a', 'b', 'x', 'y'}
{'y', 'b', 'x', 'a'}
>>> len(b)
4
>>> 'x' in b, 'c' not in b
(True, True)
isdisjoint(other) 如果集合中没有与 other 共有的元素则返回 True 。 当且仅当两个集合的交集为空集合时,两者为不相交集合。
>>> a, b
({'z', 'b', 'n', 'f', 'y'}, {'y', 'b', 'x', 'a'})
>>> a.isdisjoint(b), a.isdisjoint({'c', 'd'})
(False, True)
-
issubset(other)
set <= other 测试set 中的每个元素是否都在 other 中。set < other 测试set 是否是other 的真子集,即set <= other and set != other 。 >>> set("abc").issubset(set('abcd'))
True
>>> set("abc") <= set('abcd')
True
>>> set("abc") < set('abc')
False
-
issuperset(other)
set >= other 测试 other 中的每个元素是否都在set 中。set > other 测试该set 是否是other 的真超集,即set >= other and set != other 。 >>> set("abcd").issuperset(set('ab'))
True
>>> set("abcd") >= set('ab')
True
>>> set("abcd") > set('ab')
True
运算
-
并集union(*others)
set | other | ... 返回一个包含set 中的元素和others 的新集合。 -
交集intersection(*others)
set & other & ... 返回一个新的集合,其中包含set 和others 共有的元素。
>>> set("abc").union(set("bcd"))
{'d', 'c', 'a', 'b'}
>>> set("abc") | set("bcd")
{'d', 'c', 'a', 'b'}
>>> set("abc").intersection(set("bcd"))
{'b', 'c'}
>>> set("abc") & set("bcd")
{'b', 'c'}
>>> set("abc").difference(set("bcd"))
{'a'}
>>> set("abc") - set("bcd")
{'a'}
>>> set("abc").symmetric_difference(set("bcd"))
{'d', 'a'}
>>> set("abc") ^ set("bcd")
{'d', 'a'}
Notes:union() 、intersection() 、difference() 和 symmetric_difference() 、issubset() 和 issuperset() 方法的非运算符版本将接受任何可迭代对象作为参数。 相比之下,它们的基于运算符的对应物需要设置它们的参数。 这排除了像 set('abc') & 'cbs' 这样容易出错的结构,而支持更易读的 set('abc').intersection('cbs') 。
set&frozenset的区别
set 和 frozenset 均支持集合与集合的比较。 两个集合当且仅当每个集合中的每个元素均包含于另一个集合之内(即各为对方的子集)时则相等。 一个集合当且仅当其为另一个集合的真子集(即为后者的子集但两者不相等)时则小于另一个集合。 一个集合当且仅当其为另一个集合的真超集(即为后者的超集但两者不相等)时则大于另一个集合。
set 的实例与 frozenset 的实例之间基于它们的成员进行比较。 例如 set('abc') == frozenset('abc') 返回 True ,set('abc') in set([frozenset('abc')]) 也一样。
子集与相等比较并不能推广为完全排序函数。 例如,任意两个非空且不相交的集合不相等且互不为对方的子集,因此以下 所有 比较均返回 False : a<b , a==b , or a>b 。
由于集合仅定义了部分排序(子集关系),因此由集合构成的列表list.sort() 方法的输出并无定义。
集合的元素,与字典的键类似,必须为 hashable 。
混合了 set 实例与 frozenset 的二进制位运算将返回与第一个操作数相同的类型。例如: frozenset('ab') | set('bc') 将返回 frozenset 的实例。
下面列出了可用于 set 而不能用于不可变的 frozenset 实例的操作:
自运算
update(*others)
set |= other | ... 更新集合,添加来自 others 中的所有元素。 intersection_update(*others) set &= other & ... 更新集合,只保留其中在所有 others 中也存在的元素。
>>> s = {'b', 'c', 'a'}
>>> s.update(set("bcd"))
>>> s
{'d', 'c', 'a', 'b'}
>>> s.intersection_update(set("bcd"))
>>> s
{'b', 'd', 'c'}
difference_update(*others) set -= other | ... 更新集合,移除其中也存在于 others 中的元素。symmetric_difference_update(other) set ^= other 更新集合,只保留存在于集合的一方而非共同存在的元素。
>>> s = {'b', 'c', 'a'}
>>> s.difference_update(set("bcd"))
>>> s
{'a'}
>>> s.symmetric_difference_update(set("bcd"))
>>> s
{'b', 'd', 'c', 'a'}
增删改
add(elem) 将元素 elem 添加到集合中。remove(elem) 从集合中移除元素 elem 。 如果 elem 不存在于集合中则会引发 KeyError 。discard(elem) 如果元素 elem 存在于集合中则将其移除。pop() 从集合中移除并返回任意一个元素。 如果集合为空则会引发 KeyError 。
>>> s = {'b', 'd', 'c', 'a'}
>>> s.add("e")
{'e', 'd', 'b', 'c', 'a'}
>>> s.remove("e")
{'d', 'b', 'c', 'a'}
>>> s.discard("e")
>>> s.remove("e")
KeyError: 'e'
>>> s.pop()
'd'
clear() 从集合中移除所有元素。copy() 返回集合的浅拷贝。
>>> s = {'b', 'd', 'c', 'a'}
>>> sa = s.copy()
>>> s.clear()
>>> s, sa
(set(), {'b', 'd', 'c', 'a'})
Notes,非运算符版本的 update() , intersection_update() , difference_update() 和 symmetric_difference_update() 方法将接受任意可迭代对象作为参数。
Notes,__contains__() , remove() 和 discard() 方法的 elem 参数可能是一个 set 。 为支持对一个等价的 frozenset 进行搜索,会根据 elem 临时创建一个该类型对象。
集合遍历
由于set 对象是由具有唯一性的 hashable 对象所组成的无序多项集,故不能用下标来访问,但可以使用迭代把集合中的值读出来。也可以转为其它格式查看
>>> s = {'b', 'd', 'c', 'a'}
>>> for i in s:
print(i, end = ' ')
b d c a
>>> list(s)
['b', 'd', 'c', 'a']
>>> tuple(s)
('b', 'd', 'c', 'a')
|