如何在 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
相关文章
Pandas DataFrame DataFrame.shift() 函数
发布时间:2024/04/24 浏览次数:133 分类:Python
-
DataFrame.shift() 函数是将 DataFrame 的索引按指定的周期数进行移位。
Python pandas.pivot_table() 函数
发布时间:2024/04/24 浏览次数:82 分类:Python
-
Python Pandas pivot_table()函数通过对数据进行汇总,避免了数据的重复。
Pandas read_csv()函数
发布时间:2024/04/24 浏览次数:254 分类:Python
-
Pandas read_csv()函数将指定的逗号分隔值(csv)文件读取到 DataFrame 中。
Pandas 多列合并
发布时间:2024/04/24 浏览次数:628 分类:Python
-
本教程介绍了如何在 Pandas 中使用 DataFrame.merge()方法合并两个 DataFrames。
Pandas loc vs iloc
发布时间:2024/04/24 浏览次数:837 分类:Python
-
本教程介绍了如何使用 Python 中的 loc 和 iloc 从 Pandas DataFrame 中过滤数据。
在 Python 中将 Pandas 系列的日期时间转换为字符串
发布时间:2024/04/24 浏览次数:894 分类:Python
-
了解如何在 Python 中将 Pandas 系列日期时间转换为字符串