Python defaultdict

Python defaultdict

在Python中,defaultdictcollections模块中的一个类,它是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:

Python defaultdict

使用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:

Python defaultdict

示例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:

Python defaultdict

示例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:

Python defaultdict

设置默认值

我们可以通过传入一个函数来设置defaultdict的默认值。当访问一个不存在的键时,该函数会被调用来生成默认值。

示例4:设置默认值为lambda函数

from collections import defaultdict

default_dict_lambda = defaultdict(lambda: "default")
print(default_dict_lambda['a'])  # 输出:default

Output:

Python defaultdict

示例5:设置默认值为固定值

from collections import defaultdict

default_dict_fixed = defaultdict(lambda: 0)
default_dict_fixed['a'] = 1
print(default_dict_fixed['b'])  # 输出:0

Output:

Python defaultdict

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:

Python defaultdict

示例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:

Python defaultdict

示例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:

Python defaultdict

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:

Python defaultdict

示例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:

Python defaultdict

总结

defaultdict是Python中一个非常实用的数据结构,它可以帮助我们更方便地处理字典中的默认值问题,避免了一些繁琐的判断和异常处理。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程