迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

如何在 Python中创建Defaultdict的Defaultdict

作者:迹忆客 最近更新:2023/04/24 浏览次数:

Python 具有内置的容器,例如 dict、list、set 和 tuple,它们具有通用的思想。 为了扩展或改进这些通用容器,Python 提供了一个模块,它引入了称为 Python 集合的专用容器数据类型。

一种这样的专用容器数据类型是 defaultdict,它是默认 Python 词典 (dict) 的一个很好的替代品(和一个子类)。 使用 defaultdict,您可以提供工厂函数来提供缺失值(而不是 KeyError 异常或消息)。

因此,如果键不存在于字典中,则调用工厂函数并返回一个值,而不是引发 KeyError 异常。

使用 defaultdict 可能相对简单,但使用 defaultdict 的 defaultdict 可能会令人困惑。 本文将解释如何在不引起任何错误的情况下创建 defaultdict 的 defaultdict 以及它的内在操作是如何发生的。


使用lambda在Python中创建Defaultdict的Defaultdict

要使用 Python 集合和固有的 defaultdict,您可以使用 Python 表达式导入集合模块:

from collections import defaultdict

注意 defaultdict 是 dict 类的子类,下面的 Python 表达式可以检查它:

issubclass(defaultdict, dict)

输出:

True

使用 dict 时,当将不存在的键传递给字典时,它会触发 __missing__ 方法,该方法将 default_factory 属性设置为 None,因此会导致 KeyError 异常。 但是,对于 default_dict,当将不存在的键传递给字典时,它会触发 __missing__ 方法的 default_factory 属性,该属性包含一个返回默认值的工厂。

例如,我们可以有一个包含工厂函数 list 的 defaultdict 字典,当传递一个不存在的键时,它返回一个空列表。

from collections import defaultdict

ddict = defaultdict(list)
print(ddict["one"])

输出:

[]

虽然 ddict 没有 key one,但它返回一个空列表的值,因为传递了工厂函数。 它甚至在这样的表达式之后创建密钥。

from collections import defaultdict

ddict = defaultdict(list)
print(ddict["one"])
print(ddict["two"].append(1))

print(ddict)

输出:

[]
defaultdict(<class 'list'>, {'one': [], 'two': [1]})

因此,在 ddict["one"]ddict["two"].append(1) 语句之后,它会根据列表函数创建相应的键和相应的值。 对于第二个 Python 语句,它根据 default_factory 属性函数创建空列表,然后将值 1 附加到它。

defaultdict 数据类型中典型的值分组的处理方式与 dict 数据类型不同。

sentence = 'the man loves oranges, but also cares a great deal about apples'

letterStore = dict()

for i in sentence:
    if k not in letterStore:
        letterStore[i] = 1
        continue
    letterStore[i] += 1

print(letterStore.items())

输出:

dict_items([('t', 4), ('h', 1), ('e', 7), (' ', 11), ('m', 1), ('a', 9), ('n', 2), ('l', 4), ('o', 4), ('v', 1), ('s', 5), ('r', 3), ('g', 2), (',', 1), ('b', 2), ('u', 2), ('c', 1), ('d', 1), ('p', 2)])

上面的字母分组可以使用 defaultdict 轻松完成。 与其让代码块检查字母是否已经在 letterStore 绑定中以创建初始编号,不如使用 defaultdict 通过工厂函数 - int 来实现。

from collections import defaultdict

sentence = 'the man loves oranges, but also cares a great deal about apples'

letterStore = defaultdict(int)

for i in sentence:
    letterStore[i] += 1

print(letterStore.items())

输出:

dict_items([('t', 4), ('h', 1), ('e', 7), (' ', 11), ('m', 1), ('a', 9), ('n', 2), ('l', 4), ('o', 4), ('v', 1), ('s', 5), ('r', 3), ('g', 2), (',', 1), ('b', 2), ('u', 2), ('c', 1), ('d', 1), ('p', 2)])

因此,有了这个,我们知道当键不存在时,将调用 __missing__ 方法。 它的属性 default_factory 也被触发,它持有一个返回值的函数。

但是,我们可以创建一个 defaultdict 的 defaultdict 吗? 是的,但我们怎样才能做到呢? 因为如果你将一个defaultdict传递给另一个defaultdict,它会导致错误。

from collections import defaultdict

d = defaultdict(defaultdict(int))
print(d)

输出:

Traceback (most recent call last):
  File "c:\Users\USER\Desktop\JS\test.py", line 3, in <module>
    d = defaultdict(defaultdict(int))
TypeError: first argument must be callable or None

当我们运行代码时会抛出 TypeError,这是因为行 d = defaultdict(defaultdict(int)) ,它说第一个参数必须是可调用的或无。

有了这些信息,我们可以推断出我们没有传递可调用(函数)或 None(default_factory 持有的默认值),这是因为 defaultdict(int) 不可调用。 然而,它是一个“collections.defaultdict”。

因此,我们需要找到一种方法来传递可调用对象,这就是 lambda 派上用场的地方。

lambda 允许我们创建一个可以调用的匿名函数(可调用)。 所以,对于上层的defaultdict,我们可以传递一个指向defaultdict(int)的lambda函数,当我们传递一个不存在的key时会调用它。

lambda 函数调用内部 defaultdict 中的工厂函数并返回其值,该值将被设置为键值。

from collections import defaultdict

d = defaultdict(lambda: defaultdict(int))
print(d)

输出:

defaultdict(<function <lambda> at 0x000001F6B9383E20>, {})

为了证明它工作正常,我们可以使用方块表示法访问顶层 defaultdict 和内层 defaultdict 以查看它们的默认值,这些默认值应该分别传递给 lambda 和 int 函数。

print(d[0])
print(d[0][0])

输出:

defaultdict(<class 'int'>, {})
0

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Django 中的 Slug

发布时间:2023/05/04 浏览次数:173 分类:Python

本篇文章旨在定义一个 slug 以及我们如何使用 slug 字段在 Python 中使用 Django 获得独特的帖子。

Django ALLOWED_HOSTS 介绍

发布时间:2023/05/04 浏览次数:181 分类:Python

本文展示了如何创建您的 Django 网站,为公开发布做好准备,如何设置 ALLOWED_HOSTS 以及如何在使用 Django 进行 Web 部署期间修复预期的主要问题。

Django 中的 Select_related 方法

发布时间:2023/05/04 浏览次数:129 分类:Python

本文介绍了什么是查询集,如何处理这些查询以及我们如何利用 select_related() 方法来过滤 Django 中相关模型的查询。

在 Django 中上传媒体文件

发布时间:2023/05/04 浏览次数:198 分类:Python

在本文中,我们简要介绍了媒体文件以及如何在 Django 项目中操作媒体文件。

Django 返回 JSON

发布时间:2023/05/04 浏览次数:106 分类:Python

在与我们的讨论中,我们简要介绍了 JSON 格式,并讨论了如何借助 Django 中的 JsonResponse 类将数据返回为 JSON 格式。

在 Django 中创建对象

发布时间:2023/05/04 浏览次数:59 分类:Python

本文的目的是解释什么是模型以及如何使用 create() 方法创建对象,并了解如何在 Django 中使用 save() 方法。

在 Django 中为多项选择创建字段

发布时间:2023/05/04 浏览次数:75 分类:Python

在本文中,我们将着眼于为多项选择创建一个字段,并向您展示如何允许用户在 Django 中进行多项选择。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便