dict 和 collections.defaultdict 有什么区别?

新手上路,请多包涵

我正在查看 Peter Norvig 关于如何编写简单拼写检查器的 代码。一开始,他使用这段代码将单词插入字典。

 def train(features):
    model = collections.defaultdict(lambda: 1)
    for f in features:
        model[f] += 1
    return model

Python 字典和这里使用的字典有什么区别?另外, lambda 是干什么用的?我在 这里 查看了 API 文档,它说 defaultdict 实际上是从 dict 派生的,但是如何决定使用哪一个呢?

原文由 Legend 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 703
2 个回答

不同之处在于 defaultdict 如果尚未设置该键,则将“默认”一个值。如果您没有使用 defaultdict 您必须检查该密钥是否存在,如果不存在,请将其设置为您想要的。

lambda 为默认值定义了一个工厂。只要需要默认值,就会调用该函数。您可以假设有一个更复杂的默认函数。

 Help on class defaultdict in module collections:

class defaultdict(__builtin__.dict)
 |  defaultdict(default_factory) --> dict with default factory
 |
 |  The default factory is called without arguments to produce
 |  a new value when a key is not present, in __getitem__ only.
 |  A defaultdict compares equal to a dict with the same items.
 |

(来自 help(type(collections.defaultdict()))

{}.setdefault 本质上是相似的,但采用一个值而不是工厂函数。如果该值尚不存在,它用于设置该值……不过,这有点不同。

原文由 Donald Miner 发布,翻译遵循 CC BY-SA 3.0 许可协议

礼貌:- https://shirishweb.wordpress.com/2017/05/06/python-defaultdict-versus-dict-get/

使用普通字典

d={}
d['Apple']=50
d['Orange']=20
print(d['Apple'])
print(d['Grapes'])# This gives Key Error

我们也可以通过在普通字典中使用默认值来避免这个 KeyError,让我们看看我们如何做

d={}
d['Apple']=50
d['Orange']=20
print(d['Apple'])
print(d.get('Apple'))
print(d.get('Grapes',0)) # DEFAULTING

使用默认字典

from collections import defaultdict
d = defaultdict(int) ## inside parenthesis we say what should be the default value.
d['Apple']=50
d['Orange']=20
print(d['Apple'])
print(d['Grapes']) ##→ This gives Will not give error

使用用户定义的函数来默认值

from collections import defaultdict
def mydefault():
        return 0

d = defaultdict(mydefault)
d['Apple']=50
d['Orange']=20
print(d['Apple'])
print(d['Grapes'])

概括

  1. 普通字典中的默认值视具体情况而定,在 defaultdict 中,我们可以以一般方式提供默认值

  2. 使用 defaultdict 默认的效率是使用普通 dict 默认的两倍。您可以参考以下链接以更好地了解此性能测试 https://shirishweb.wordpress.com/2017/05/06/python-defaultdict-versus-dict-get/

原文由 sakeesh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题