如何锁定Python defaultdict的现有键且无需复制?dict(d)是O(1)操作吗?
问题解答
1. 锁定defaultdict现有键的方案
直接修改defaultdict的default_factory属性为None即可,不需要复制任何键值对,操作复杂度为O(1)。
当default_factory被设置为None后,defaultdict的行为会完全和普通字典一致:访问不存在的键时会直接抛出KeyError,不会再自动初始化新键值对,现有键值对也不会受到任何影响。
示例代码:
import collections d = collections.defaultdict(set) for i in range(3): d[i].add(True) # 锁定字典,禁止自动生成新键 d.default_factory = None # 此时访问不存在的键会抛出KeyError,和普通字典一致 print(d[10]) # 抛出 KeyError: 10
如果你不想修改原defaultdict,也可以在访问时用get方法避免意外生成新键:
# 不存在的键返回空集合,不会修改原字典 for b in d.get(10, set()): print(b)
2. d = dict(d)的时间复杂度
这个操作不是O(1),而是O(n),n为原字典中键值对的总数量。dict构造器会遍历原字典的所有键值对,逐个复制到新创建的普通字典实例中,数据量越大,操作耗时越高。
内容的提问来源于stack exchange,提问作者micah
相关产品推荐
相关产品推荐

