Skip to content

6 、集合与字典


一、集合🧀

1、创建🧀

集合(set)是一个无序的不重复元素序列。并且可以进行交集、并集、差集等常见的集合操作。

  • 不能使用下标访问集合
set1 = {1, 2, 3, 4}  # 直接使用大括号创建集合
set2 = set([4, 5, 6, 7])  # 使用 set() 函数从列表创建集合

创建一个空集合必须用 set() 而不是 {},因为 {} 是用来创建一个空字典。


2、内建函数🧀

函数 说明
add(x) 添加元素 x
remove(x) 删除元素 x(若不存在会报错)
discard(x) 删除元素 x(若不存在不会报错)
clear() 清空集合
union(other) 并集:返回两个集合的所有元素(不重复)
intersection(other) 交集:返回两个集合共有的元素
difference(other) 差集:返回仅存在于 a 中的元素
symmetric_difference(other) 对称差集:返回 ab 中非共有的元素

3、集合特性🧀

  • 无序
  • 唯一
  • 元素不可变
  • 快速访问:\(O(1)\)

哈希

哈希函数(hash()):

  • 输入任意值,输出一个整数。
  • 相同值的哈希值总是一样,但不同值的哈希值通常不同
  • 在集合或字典中,Python 用哈希值来快速定位元素。

内部结构:哈希表(Hash Table)

  • Python 内部用一个 哈希表 存储集合元素。
  • 这个哈希表可以理解为一个由 N 个“桶”(bucket)组成的列表。

元素添加的过程:

1
2
3
hash(element)   # 计算哈希值
hash(element) % n # 确定桶的位置
hashTable[bucketIndex].append(element) # 将元素放入对应桶中

→ 所有操作都是 \(O(1)\) 的时间复杂度!


二、字典🧀

字典是另一种可变容器模型,且可存储任意类型对象。

d = {key1 : value1, key2 : value2, key3 : value3 }
stateMap = {
    'pittsburgh': 'PA',
    'chicago': 'IL',
    'seattle': 'WA',
    'boston': 'MA',
}

city = input("Enter a city: ").lower()

# 通过 key 来访问字典元素 -> dict[key]
if city in stateMap:
    print(f"{city} is in {stateMap[city]}")
else:
    print(f"Never heard of {city}..")

1、创建🧀

  • 空字典
d1 = dict() # 使用 dict() 函数
d2 = { }    # 使用 {}
  • 静态分配
d = { "cow": 5, "dog": 98, "cat": 1 }
  • 成对元组
pairs = [("cow", 5), ("dog", 98), ("cat", 1)]
d = dict(pairs)

2、内建方法🧀

函数 用途说明
dict.clear() 删除字典内所有元素
dict.copy() 返回一个字典的浅复制
dict.fromkeys(seq, val) 创建一个新字典,以序列 seq 中元素为键,所有键对应的值为 val
dict.get(key, default=None) 返回指定键的值,若键不存在则返回 default 默认值
key in dict 判断键是否存在于字典中,存在返回 True,否则返回 False
dict.items() 返回包含字典中所有 (键, 值) 对的视图对象
dict.keys() 返回包含字典所有键的视图对象
dict.setdefault(key, default=None) 如果键存在,返回其值;否则添加该键并设为 default
dict.update(dict2) 将字典 dict2 中的键值对添加/更新到当前字典中
dict.values() 返回包含字典所有值的视图对象
dict.pop(key[, default]) 删除键 key 对应的值并返回;若不存在且未设置 default,则报错
dict.popitem() 删除并返回字典中的最后一组 (键, 值) 对(Python 3.7+ 保持插入顺序)

3、字典特性🧀

  • 键(key)是无序的集合(set)
  • 键是唯一的
  • 值可以任取数据类型,但是键必须是可哈希的(不能是list)