加载中...

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}

比普通字典更实用的优点:

  1. 当访问不存在的键时,用Counter()定义的字典不会报错 \(KeyError\),而会直接返回 \(0\) (与cpp中的map一模一样)
  2. 待补充

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位的随机数
posted @ 2025-07-20 17:32  jxs123  阅读(17)  评论(0)    收藏  举报