如何在 Python中创建Defaultdict的Defaultdict
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
相关文章
Django 中的 Slug
发布时间:2023/05/04 浏览次数:173 分类:Python
-
本篇文章旨在定义一个 slug 以及我们如何使用 slug 字段在 Python 中使用 Django 获得独特的帖子。
在 Django 中按降序过滤查询集中的项目
发布时间:2023/05/04 浏览次数:157 分类:Python
-
在这个讲解中,学习如何借助 Django 中的 order_by() 方法按降序过滤出查询集中的项目。
Django ALLOWED_HOSTS 介绍
发布时间:2023/05/04 浏览次数:181 分类:Python
-
本文展示了如何创建您的 Django 网站,为公开发布做好准备,如何设置 ALLOWED_HOSTS 以及如何在使用 Django 进行 Web 部署期间修复预期的主要问题。
Django 中的 Select_related 方法
发布时间:2023/05/04 浏览次数:129 分类:Python
-
本文介绍了什么是查询集,如何处理这些查询以及我们如何利用 select_related() 方法来过滤 Django 中相关模型的查询。
使用 Post 请求将数据发送到 Django 服务器
发布时间:2023/05/04 浏览次数:159 分类:Python
-
在这篇关于Django的讲解中,我们简要介绍了post和get请求以及如何在Django中用post实现CSRF token。
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 中进行多项选择。