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
的实例提供以下操作:
-
len(s)
返回集合s
中元素的数量(s
的基数)。 -
x in s
测试x
在s
中的成员资格。 -
x not in s
中测试x
是否为s
中的非成员。
>>> 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'}
-
差集
difference(*others)
set - other - ...
返回一个新集合,该集合中的元素不在others
中。
-
对称差集
symmetric_difference(other)
set ^ other
返回一个新集合,其中的元素或属于set
或属于other
指定的其他集合,但不能同时属于两者。
>>> 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 |= set("bcd")
>>> s
{'d', 'c', 'a', 'b'}
>>> s.intersection_update(set("bcd"))
# s &= 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 -= set("bcd")
>>> s
{'a'}
>>> s.symmetric_difference_update(set("bcd"))
# s ^= 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')