Python defaultdict
在Python中,defaultdict
是collections
模块中的一个类,它是dict
的一个子类,可以为字典的值提供默认值。当我们访问一个不存在的键时,defaultdict
会自动为该键设置一个默认值,而不会抛出KeyError
异常。
创建defaultdict对象
我们可以使用defaultdict
类来创建一个默认字典对象。在创建defaultdict
对象时,我们需要传入一个默认值的类型或者一个函数,用来生成默认值。
from collections import defaultdict
# 创建一个默认值为int的defaultdict对象
default_dict_int = defaultdict(int)
print(default_dict_int['a']) # 输出:0
# 创建一个默认值为list的defaultdict对象
default_dict_list = defaultdict(list)
print(default_dict_list['b']) # 输出:[]
Output:
使用defaultdict的示例
示例1:统计字符串中每个字符出现的次数
from collections import defaultdict
def count_characters(s):
char_count = defaultdict(int)
for char in s:
char_count[char] += 1
return char_count
s = "geek-docs.com"
char_count = count_characters(s)
print(char_count)
Output:
示例2:按照字符长度分组字符串列表
from collections import defaultdict
def group_by_length(strings):
grouped_strings = defaultdict(list)
for string in strings:
grouped_strings[len(string)].append(string)
return grouped_strings
strings = ["geek-docs.com", "python", "defaultdict", "example"]
grouped_strings = group_by_length(strings)
print(grouped_strings)
Output:
示例3:计算每个单词的长度
from collections import defaultdict
def word_length(words):
word_lengths = defaultdict(int)
for word in words:
word_lengths[word] = len(word)
return word_lengths
words = ["geek-docs.com", "python", "defaultdict", "example"]
word_lengths = word_length(words)
print(word_lengths)
Output:
设置默认值
我们可以通过传入一个函数来设置defaultdict
的默认值。当访问一个不存在的键时,该函数会被调用来生成默认值。
示例4:设置默认值为lambda函数
from collections import defaultdict
default_dict_lambda = defaultdict(lambda: "default")
print(default_dict_lambda['a']) # 输出:default
Output:
示例5:设置默认值为固定值
from collections import defaultdict
default_dict_fixed = defaultdict(lambda: 0)
default_dict_fixed['a'] = 1
print(default_dict_fixed['b']) # 输出:0
Output:
defaultdict与普通字典的比较
defaultdict
与普通字典在使用上有一些区别,下面我们来比较一下它们的不同之处。
示例6:访问不存在的键
from collections import defaultdict
# 使用defaultdict
default_dict = defaultdict(int)
print(default_dict['a']) # 输出:0
# 使用普通字典
normal_dict = {}
# print(normal_dict['a']) # 会抛出KeyError异常
Output:
示例7:设置默认值
from collections import defaultdict
# 使用defaultdict
default_dict = defaultdict(int)
print(default_dict['a']) # 输出:0
# 使用普通字典
normal_dict = {}
print(normal_dict.get('a', 0)) # 输出:0
Output:
示例8:添加键值对
from collections import defaultdict
# 使用defaultdict
default_dict = defaultdict(int)
default_dict['a'] += 1
print(default_dict) # 输出:defaultdict(<class 'int'>, {'a': 1})
# 使用普通字典
normal_dict = {}
normal_dict['a'] = normal_dict.get('a', 0) + 1
print(normal_dict) # 输出:{'a': 1}
Output:
defaultdict的高级用法
示例9:嵌套defaultdict
我们可以创建嵌套的defaultdict
,以便更方便地处理多层嵌套的数据结构。
from collections import defaultdict
nested_dict = lambda: defaultdict(nested_dict)
data = nested_dict()
data['a']['b']['c'] = 1
print(data) # 输出:defaultdict(<function <lambda> at 0x7f8b1c1b6d30>, {'a': defaultdict(<function <lambda> at 0x7f8b1c1b6d30>, {'b': defaultdict(<function <lambda> at 0x7f8b1c1b6d30>, {'c': 1})})})
Output:
示例10:使用defaultdict处理图数据结构
我们可以使用defaultdict
来处理图数据结构,方便地添加和访问节点和边。
from collections import defaultdict
graph = defaultdict(list)
graph['A'].append('B')
graph['A'].append('C')
graph['B'].append('A')
graph['B'].append('D')
print(graph) # 输出:defaultdict(<class 'list'>, {'A': ['B', 'C'], 'B': ['A', 'D']})
Output:
总结
defaultdict
是Python中一个非常实用的数据结构,它可以帮助我们更方便地处理字典中的默认值问题,避免了一些繁琐的判断和异常处理。