【问题标题】:Replace collections' defaultdict by a normal dict with setdefault将集合的 defaultdict 替换为具有 setdefault 的普通 dict
【发布时间】:2019-10-31 19:44:08
【问题描述】:

我经常使用collections.defaultdict 来将一个元素附加到d[key],而不必先将其初始化为[](好处:你不需要这样做:if key not in d: d[key] = []):

import collections, random
d = collections.defaultdict(list)  
for i in range(100):
    j = random.randint(0,20)
    d[j].append(i)  # if d[j] does not exist yet, initialize it to [], so we can use append directly

现在我意识到我们可以简单地使用普通的dictsetdefault

import random
d = {}
for i in range(100):
    j = random.randint(0,20)
    d.setdefault(j, []).append(i)

问题:当使用值为列表的dict 时,是否有充分的理由使用collections.defaultdict 而不是第二种方法(使用简单的dictsetdefault),或者是它们完全等价吗?

【问题讨论】:

  • 请@downvoter,您能否添加有关如何改进问题的说明(格式?措辞?等)提前谢谢您。

标签: python dictionary defaultdict


【解决方案1】:

collections.defaultdict 通常性能更高,它针对此任务进行了优化并由 C 语言实现。但是,如果您想访问结果字典中缺少的键以生成 KeyError 而不是插入空列表,则应使用 dict.setdefault。这是最重要的实际区别。

【讨论】:

    【解决方案2】:

    除了 Chris_Rands 的回答之外,我想进一步强调,使用 defaultdict 的主要原因是您希望密钥访问始终成功,如果没有,则插入默认值。 这可能出于任何原因,一个完全有效的原因是能够使用[] 而不必在每次访问之前都调用dict.setdefault

    还要注意,如果以前从未访问过该密钥,key in default_dict 仍将返回 False,因此您仍可以在必要时检查 defaultdict 中是否存在密钥。这允许在不检查列表是否存在的情况下附加到列表,但如果需要,还可以检查列表是否存在。

    【讨论】:

      【解决方案3】:

      使用defaultdict 时,您可以进行就地添加:

      import collections, random
      d = collections.defaultdict(list)  
      for i in range(100):
          j = random.randint(0,20)
          d[j] += [i]
      

      没有像d.setdefault(j, []) += [i] 这样的等效结构,它给出SyntaxError: cannot assign to function call

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-24
        • 2012-09-15
        • 2021-02-04
        • 1970-01-01
        • 2016-12-02
        • 2012-11-08
        • 2012-10-28
        • 1970-01-01
        相关资源
        最近更新 更多