在使用Python中的字典时,有两种常见的方法:使用built-in dictionary
或使用Collections模块中的defaultdict
。虽然这两个选项都允许您以键值格式存储和检索数据,但有一些关键差异使违约dict在许多情况下成为更好的选项。
在这篇博客文章中,我们将探讨这些差异,并提供有关如何在Python中使用字典的更有效选择的示例。
这就是为什么您应该使用defaultdict()
:
- 清洁器代码
- 避免密钥错误
- 自定义默认值
- 更快的执行
清洁器代码
使用defaultdict
的主要好处之一是它简化了您的代码。当您使用常规dict
时,您需要在尝试访问字典之前手动检查键是否存在。
例如,考虑以下代码:
my_dict = {}
my_dict['apple'] = 1
if 'apple' in my_dict:
my_dict['apple'] += 1
else:
my_dict['apple'] = 1
在此代码中,我们检查了my_dict中的密钥“苹果”是否存在,并增加其值。否则,我们将其值设置为1。
可以使用defaultdict
编写相同的代码:
from collections import defaultdict
my_dict = defaultdict(int)
my_dict['apple'] += 1
在此代码中,我们只需访问my_dict中的“苹果”键,然后增加其值。如果密钥不存在,默认数据将创建它并将其值初始化为默认值0。
避免关键错误
使用defaultdict
的另一个好处是,它避免了KeyError
异常,这些异常在常规dictionary
中访问不存在的键时可能会发生。
例如,考虑以下代码:
my_dict = {}
my_dict['apple'] += 1
在此代码中,我们正在尝试将MY_DICT中“ Apple”密钥的值增加。但是,由于该密钥不存在,因此该代码将引起keyError异常。
使用违约的相同代码将在不提出例外的情况下工作:
from collections import defaultdict
my_dict = defaultdict(int)
my_dict['apple'] += 1
在此代码中,如果键'apple'
在my_dict
中不存在,则defaultdict
将创建它并将其值初始化为0。然后,我们可以安全地递增其值,而不必担心提高KeyError
异常。
自定义默认值
使用字典时,您可以通过检查键是否存在字典中来指定自定义default
值。如果不存在密钥,则可以为该密钥设置一个default
值。这是一个例子:
my_dict = {}
key = 'foo'
if key not in my_dict:
my_dict[key] = 0
print(my_dict[key]) # 0
在此示例中,我们创建一个空词典my_dict
。然后,我们检查字典中是否存在键'foo'
。如果不存在密钥,我们为该密钥设置0
的默认值。然后,我们打印与键'foo'
相关的值。
通过为任何不存在的键提供默认值,defaultDict类简化了用于创建自定义默认值的代码。创建默认数据时,您可以将默认值指定为参数。这是一个例子:
from collections import defaultdict
my_dict = defaultdict(int)
key = 'foo'
print(my_dict[key]) # 0
在此示例中,我们定义了返回字符串'default'的函数default_value。然后,我们以Default_value为默认值创建一个默认文件my_dict。然后,我们尝试访问密钥“ foo”。由于键在字典中不存在,因此默认数据返回默认值'默认值'。
更快的执行
在某些情况下,默认数据可能比内置词典更快,尤其是在创建大词典时。这是因为当创建字典时,默认数据用默认值初始化所有键。这可以减少我们需要检查关键存在并从字典中检索值的次数。
import time
# Using the built-in dictionary
start_time = time.time()
my_dict = {}
for i in range(10000000):
my_dict[i] = i
print("Built-in dictionary took", time.time() - start_time, "seconds.")
# Using defaultdict
start_time = time.time()
my_dict = defaultdict(int)
for i in range(10000000):
my_dict[i] = i
print("Defaultdict took", time.time() - start_time, "seconds.")
此代码的输出将是:
Built-in dictionary took 1.4013495445251465 seconds.
Defaultdict took 0.9122903347015381 seconds.
综上所述
在python中使用内置字典上的默认数据始终是最好的练习,因为它简化了代码,允许不存在的键的默认值,并且在某些情况下可以更快,尤其是在创建大型词典时。这可以使我们的代码更具可读性,易于错误且更快。