python 字典
定义空字典:
dict = {}
添加——直接赋值即可,eg:
dict[1] = 2
(注意要访问的键不存在时,只有赋值语句可访问,其他形式的访问均会报错 \(KeyError\))
删除:
del dict[1]
遍历:
- dict.keys() -> 提取所有键
- dict.values() -> 提取所有键值
- dict.items() -> 提取所有键值对
(最常用):
for key, value in dict.items():
...
(也支持 enumerate 形式的遍历):
for i, x in enumerate(dict): # i 为下标(从0开始),x为键
...
字典是无序的(与cpp中map不同的一点),若想按键升序遍历字典:利用sorted
for key, value in sorted(dict.items()):
...
检查键是否存在:
if 3 (not) in dict:
...
清空:
dict.clear()
dict中一个功能强大的子类——Counter()。本质上是一个计数器,很多功能与字典等价,并且比字典更实用:
定义空字典:
dict = Counter()
Counter()也可以传参数(可计数的对象,如列表,字符串),直接生成相应对象的字典。eg:
a = [1, 1, 4, 5, 1, 4]
dict1 = Counter(a) # {1:3, 4:2, 5:1}
s = "jjjxs"
dict2 = Counter(s) # {'j':3, 'x':1, 's':1}
比普通字典更实用的优点:
- 当访问不存在的键时,用Counter()定义的字典不会报错 \(KeyError\),而会直接返回 \(0\) (与cpp中的map一模一样)
- 待补充
defaultdict——字典中另一个强大的子类,核心优点与 \(Counter()\) 相同:每个键均有默认值,访问不存在的键时不会报错。性能相比普通字典也更好。
注意,defaultdict() 的括号内必须设置参数,以定义默认值的类型。
eg:
d = defaultdict(int) -> 默认值为0
d = defaultdict(list) -> 默认值为空列表
d = defaultdict(lambda: 1) -> 也可以放入lambda函数,指定默认值
d = defaultdict(lambda: defaultdict(int)) -> 相当于cpp的嵌套map
!!注意: \(python\) 中的字典是基于哈希表实现的,因此使用时可能出现字典的键发生哈希冲突导致程序运行超时。而这种哈希冲突是人为的——即可以恶意构造一组键,导致它们的哈希值相同,进而使得哈希表退化为链表,时间复杂度从 \(O(1)\) 退化为 \(O(n)\)。
解决方案:为所有键异或上一个固定的随机数 \(RD\) 即可避免哈希冲突。
from random import getrandbits
RD = getrandbits(31) # 生成二进制形式31位的随机数

浙公网安备 33010602011771号