集合与映射类型
集合类型(Set Type)
集合类型对象是由具有唯一性的可哈希对象所组成的无序多项集。
由于集合类型是无序的,它并不记录元素位置或插入顺序,因此集合类型不支持索引、切片或其他序列类的操作。
类型 | 对应关键字 | 构造函数 | 是否可变 | 是否可哈希 |
---|---|---|---|---|
set | set | set() |
可变 | 不可哈希 |
frozenset | frozenset | frozenset() |
不可变 | 可哈希 |
set
和 frozenset
的构建方式:
- 使用花括号内以逗号分隔元素的方式:
{'jack', 'sjoerd'}
- 使用集合推导式:
{c for c in 'abracadabra' if c not in 'abc'}
- 使用类型构造器:
set()
,set('foobar')
,set(['a', 'b', 'foo'])
frozenset
可通过构造函数 frozenset()
来创建:
class set([iterable])
class frozenset([iterable])
上述俩种构建器输入一个可迭代对象( iterable )返回一个新的 set
或 frozenset
对象。 如果未指定可迭代对象,则将返回一个新的空集合。
由于集合的元素必须为可哈希的,因此元素为集合的集合,其所有的内层集合必须为 frozenset
对象。
集合类型通用操作 (可用于 set
和 frozenset
)
下表中 s 代表多项集(collection),x 是任何满足 s 所规定的类型和值限制的任意对象,set代表集合,other代表另一集合。
( union()
、 intersection()
、 difference()
、symmetric_difference()
、issubset()
和 issuperset()
方法可以接受任何可迭代对象作为参数, 而基于运算符的对应方法则要求参数为集合对象。)
(混合了 set
实例与 frozenset
的二进制位运算将返回与第一个操作数相同的类型。例如: frozenset('ab') | set('bc')
将返回 frozenset
的实例。)
操作 | 操作说明 |
---|---|
len(s) |
返回集合 s 中的元素数量(即 s 的基数)。 |
x in s |
检测 x 是否为 s 中的成员。 |
x not in s |
检测 x 是否非 s 中的成员。 |
isdisjoint(other) |
如果集合中没有与 other 共有的元素则返回 True 。 当且仅当两个集合的交集为空集合时,两者为不相交集合。 |
set <= other ,issubset(other) |
检测是否集合中的每个元素都在 other 之中。 |
set < other |
检测集合是否为 other 的真子集,即 set <= other and set != other 。 |
set >= other ,issuperset(other) |
检测是否 other 中的每个元素都在集合之中。 |
set > other |
检测集合是否为 other 的真超集,即 set >= other and set != other 。 |
set | other | ... ,union(others) |
返回一个新集合,其中包含来自原集合以及 others 指定的所有集合中的元素。 |
set & other & ... ,intersection(others) |
返回一个新集合,其中包含原集合以及 others 指定的所有集合中共有的元素。 |
set - other - ... ,difference(others) |
返回一个新集合,其中包含原集合中在 others 指定的其他集合中不存在的元素。 |
set ^ other ,symmetric_difference(others) |
返回一个新集合,其中的元素或属于原集合或属于 other 指定的其他集合,但不能同时属于两者。 |
copy() |
返回原集合的浅拷贝。 |
可用于 set
但不可用于 frozenset
的操作
下表中 set代表集合,other代表另一集合。elem代表满足set所有要求的元素。
操作 | 操作说明 |
---|---|
set |= other | ... ,update(others) |
更新集合,添加来自 others 中的所有元素。 |
set &= other & ... ,intersection_update(others) |
更新集合,只保留其中在所有 others 中也存在的元素。 |
set -= other | ... ,difference_update(others) |
更新集合,移除其中也存在于 others 中的元素。 |
set ^= other ,symmetric_difference_update(others) |
更新集合,只保留存在于集合的一方而非共同存在的元素。 |
add(elem) |
将元素 elem 添加到集合中。 |
remove(elem) |
从集合中移除元素 elem。 如果 elem 不存在于集合中则会引发KeyError 。 |
discard(elem) |
如果元素 elem 存在于集合中则将其移除。 |
pop() |
从集合中移除并返回任意一个元素。 如果集合为空则会引发KeyError 。 |
clear() |
从集合中移除所有元素。 |
映射类型 - 字典(dict)
映射(mapping)类型对象会将可哈希值映射到任意对象。 映射属于可变对象。字典是内置的映射类型。
字典由键值对构成。字典的键(key)可以是任何可哈希值,而值可以是任意对象。
字典的构造方式:
- 使用花括号内以逗号分隔
键: 值
对的方式:{'jack': 4098, 'sjoerd': 4127}
or{4098: 'jack', 4127: 'sjoerd'}
- 使用字典推导式:
{}
,{x: x ** 2 for x in range(10)}
- 使用类型构造器:
dict()
,dict([('foo', 100), ('bar', 200)])
,dict(foo=100, bar=200)
构造过程中:
- 如果没有给出位置参数,将创建一个空字典。
- 如果给出一个位置参数并且其属于映射对象,将创建一个具有与映射对象相同键值对的字典。
- 否则的话,位置参数必须为一个 iterable对象。 该可迭代对象中的每一项本身必须为一个刚好包含两个元素的可迭代对象。 每一项中的第一个对象将成为新字典的一个键,第二个对象将成为其对应的值。
- 如果一个键出现一次以上,该键的最后一个值将成为其在新字典中对应的值。
- 如果给出了关键字参数,则关键字参数及其值会被加入到基于位置参数创建的字典。
- 如果要加入的键已存在,来自关键字参数的值将替代来自位置参数的值。
可用于字典(dict)的操作
d
代表一个字典
操作 | 操作说明 |
---|---|
list(d) |
返回字典 d 中使用的所有键的列表。 |
len(d) |
返回字典 d 中的项数。 |
d[key] |
返回 d 中以 key 为键的项。 如果映射中不存在 key 则会引发 KeyError 。 |
d[key] = value |
将 d[key] 设为 value。 |
del d[key] |
将 d[key] 从 d 中移除。 如果映射中不存在 key 则会引发 KeyError 。 |
key in d |
如果 d 中存在键 key 则返回 True ,否则返回 False 。 |
key not in d |
等价于 not key in d 。 |
iter(d) |
返回以字典的键为元素的迭代器。 这是 iter(d.keys()) 的快捷方式。 |
clear() |
移除字典中的所有元素。 |
copy() |
返回原字典的浅拷贝。 |
d | other |
合并 d 和 other 中的键和值来创建一个新的字典,两者必须都是字典。当 d 和 other 有相同键时, other 的值优先。 |
d |= other |
用 other 的键和值更新字典 d ,other 可以是 mapping 或 iterable 的键值对。当 d 和 other 有相同键时, other 的值优先。 |
ref:
Python 文档:集合类型 set 与 frozenset
Python 文档:映射类型 dict