跳转到主要内容
模块 3 · 第 4 课(共 4)课程中的12/36~10 min
模块课程(4/4)

套装

集合是唯一、无序元素的集合。三种超能力:

  1. 自动去重:相同元素添加两次没有效果。
  2. O(1) 成员资格测试:x in s 即使有数百万也非常快 元素的数量(它是基于哈希的,就像字典一样)。
  3. 集合运算:并、交、差、对称差。

创建一个集合

Python
vuoto = set()           # ATTENZIONE: {} è un dict vuoto, non un set!
numeri = {1, 2, 3}
da_lista = set([1, 1, 2, 3, 3, 3])   # {1, 2, 3}

单独的大括号 {} 创建一个空字典,而不是一个集合:对于空集合 你需要set()。

修改集合

Python
s = {1, 2, 3}
s.add(4)         # {1, 2, 3, 4}
s.add(1)         # nessun effetto (già presente)
s.discard(99)    # rimuove se presente, silenzioso altrimenti
s.remove(2)      # rimuove o solleva KeyError

设置操作

Python
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}

a | b    # {1, 2, 3, 4, 5, 6}     unione
a & b    # {3, 4}                  intersezione
a - b    # {1, 2}                  differenza (in a ma non in b)
a ^ b    # {1, 2, 5, 6}            differenza simmetrica (xor)

还有一些方法形式(a.union(b)、a.intersection(b)、...) 加法接受任何可迭代对象,而不仅仅是集合。

会员测试

Python
parole = {"ciao", "mondo", "python"}
"ciao" in parole       # True   O(1)
"java" not in parole   # True

作为比较:在 list 内使用 in 进行搜索的时间复杂度为 O(n),并且时间较长 列出它要慢得多。

冻结集:不可变版本

frozenset({1, 2, 3}) 是可哈希版本:它可以是字典键或 另一个集合的元素。

设置操作和性能

集合被实现为哈希表,这使得成员资格测试 (x in my_set) 非常快:它以恒定时间 O(1) 运行,与搜索需要线性时间 O(n) 的列表不同。此外,它们还支持代数运算,例如并 (|)、交集 (&) 和差 (-)。

尝试一下

锻炼#python.m3.l4.e1
尝试:0加载中...

给定列表“nums = [1, 2, 2, 3, 3, 3, 4]”,使用唯一值(以任何顺序)构建“unique_items”,然后将“count”计算为 len(unique_items)。评估“计数”。

正在加载编辑器...
显示提示

set(nums) 删除重复项。

3 次尝试后可用的解决方案

复习练习

锻炼#python.m3.l4.e2
尝试:0加载中...

给定“a = {1, 2, 3, 4}”和“b = {3, 4, 5, 6}”,将交集计算为“common_items”,将 a-b 的差值计算为“only_a”。评估元组“(common_items, only_a)”。

正在加载编辑器...
显示提示

& 交集,- 差异。

3 次尝试后可用的解决方案

额外的挑战

锻炼#python.m3.l4.e3
尝试:0加载中...

Given two sets `set_a = {1, 2, 3}` and `set_b = {2, 3, 4}`, calculate the mathematical intersection of the two sets (their common elements). Store the resulting set in `common_elements` and evaluate it.

正在加载编辑器...
显示提示

您可以使用 & 运算符或 set_a.intersection(set_b) 方法。

3 次尝试后可用的解决方案