Python中的Defaultdict
字典是Python中用于存储数据值的无序数据集合,用于存储诸如映射之类的数据值。字典保存的是键-值对,而不是像其他数据类型一样将单个值作为元素。字典中的键必须是唯一且不可变的。也就是说,Python元组可以作为键,但Python列表不能作为字典的键。我们可以通过将元素的序列放置在花括号{}中来创建字典,逗号”,”可以分隔值。
示例1:
Dict_1 = {1: 'A', 2: 'B', 3: 'C', 4: 'D'}
print ("Dictionary: ")
print (Dict_1)
print ("key pair 1: ", Dict_1[1])
print ("key pair 3: ", Dict_1[3])
输出:
Dictionary:
{1: 'A', 2: 'B', 3: 'C', 4: 'D'}
key pair 1: A
key pair 3: C
但是如果我们尝试打印第5个键值,我们将会得到一个错误,因为 “Dict_1” 不包含第5个键值。
示例2:
Dict_1 = {1: 'A', 2: 'B', 3: 'C', 4: 'D'}
print ("Dictionary: ")
print (Dict_1)
print ("key pair 5: ", Dict_1[5])
输出:
Dictionary:
{1: 'A', 2: 'B', 3: 'C', 4: 'D'}
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
in
2 print ("Dictionary: ")
3 print (Dict_1)
----> 4 print ("key pair 5: ", Dict_1[5])
KeyError: 5
每当抛出 keyError 时,这可能对用户造成问题。我们可以通过使用Python中的另一个字典来克服此错误,该字典类似于一个容器,称为 Defaultdict 。用户可以在 ‘collections’ 模块中找到这个字典。
defaultdict
defaultdict是Python的一个字典,类似于’collections’模块中的一个容器。它是字典类的子类,用于返回类似字典的对象。除了提供用户创建的字典中不存在键的默认值外,defaultdict和字典具有相同的功能,不会引发任何关键错误。
语法:
defaultdict(default_factory)
参数:
- default_factory: default_factory() 函数返回用户为其定义的字典设置的默认值。如果此参数不存在,则字典将引发 KeyError。
示例:
from collections import defaultdict as DD
# Function for returning a default values for the
# keys which are not present in the dictionary
def default_value():
return "This key is not present"
# Now, we will define the dict
dict_1 = DD(default_value)
dict_1["ABC"] = 1
dict_1["DEF"] = 2
dict_1["GHI"] = 3
dict_1["JKL"] = 4
print ("Dictionary: ")
print (dict_1)
print ("key pair 1: ", dict_1["ABC"])
print ("key pair 3: ", dict_1["GHI"])
print ("key pair 5: ", dict_1["MNO"])
输出:
Dictionary:
defaultdict(, {'ABC': 1, 'DEF': 2, 'GHI': 3, 'JKL': 4})
key pair 1: 1
key pair 3: 3
key pair 5: This key is not present
defaultdict的内部工作原理
当我们使用defaultdict时,除了标准的字典操作之外,我们还会得到一个额外的可写实例变量和一个方法。可写实例变量是default_factory参数, __missing__ 是该方法。
- default_factory: default_factory()函数返回由用户为其定义的字典设置的默认值。
示例:
from collections import defaultdict as DD
dict_1 = DD(lambda: "This key is not present")
dict_1["ABC"] = 1
dict_1["DEF"] = 2
dict_1["GHI"] = 3
dict_1["JKL"] = 4
print ("Dictionary: ")
print (dict_1)
print ("key value 1: ", dict_1["ABC"])
print ("key value 3: ", dict_1["GHI"])
print ("key value 5: ", dict_1["MNO"])
输出:
Dictionary:
defaultdict( at 0x0000019EFC4B58B0>, {'ABC': 1, 'DEF': 2, 'GHI': 3, 'JKL': 4})
key value 1: 1
key value 3: 3
key value 5: This key is not present
- __missing__(): missing()函数用于为字典提供默认值。missing()函数将default_factory作为参数,并且如果参数设置为None,则会引发KeyError异常;否则,它将为给定的键提供默认值。当请求的键未找到时,此方法实际上由dict类的getitem()函数调用。getitem()函数引发或返回在missing()函数中存在的值。
示例:
from collections import defaultdict as DD
dict_1 = DD(lambda: "This key is not present")
dict_1["ABC"] = 1
dict_1["DEF"] = 2
dict_1["GHI"] = 3
dict_1["JKL"] = 4
print ("Dictionary: ")
print (dict_1)
print ("key value 1: ", dict_1.__missing__('ABC'))
print ("key value 4: ", dict_1["JKL"])
print ("key value 5: ", dict_1.__missing__('MNO'))
输出:
Dictionary:
defaultdict( at 0x0000019EFC4B5670>, {'ABC': 1, 'DEF': 2, 'GHI': 3, 'JKL': 4})
key value 1: This key is not present
key value 4: 4
key value 5: This key is not present
如何使用”default_factory”作为列表
我们可以将列表类作为”default_factory”参数传递,它将创建一个带有以列表格式设置的值的defaultdict。
示例:
from collections import defaultdict as DD
# Defining a dictionary
dict_1 = DD(list)
for k in range(7, 12):
dict_1[k].append(k)
print ("Dictionary with values as list:")
print (dict_1)
输出:
Dictionary with values as list:
defaultdict(<class 'list'>, {7: [7], 8: [8], 9: [9], 10: [10], 11: [11]})
如何将“int”用作default_factory
我们可以将int类作为default_factory参数传递,并创建一个默认值设置为零的defaultdict。
示例:
from collections import defaultdict as DD
# Defining the dict
dict_1 = DD(int)
J = [1, 2, 3, 4, 2, 4, 1, 2]
# Now, we will iterate through the list "J"
# for keeping the count
for k in J:
# As, The default value is 0
# so we do not need to
# enter the key first
dict_1[k] += 1
print(dict_1)
输出:
defaultdict(<class 'int'>, {1: 2, 2: 3, 3: 1, 4: 2})
结论
在本教程中,我们讨论了Python中的defaultdict以及如何通过使用default_factory参数在defaultdict上执行不同的操作。