Python defaultdict方法使用分析

yizhihongxing

Python defaultdict方法使用分析

在 Python 的 collections 模块中,提供了一个名为 defaultdict 的字典类,它是 Python 标准字典(dict)的子类,能够为字典提供一些额外的API和特殊的行为。在本文中,我们将讨论 defaultdict 是什么,以及它与标准字典的区别,在哪些场景下需要使用 defaultdict,以及它的用法和示例。

什么是 defaultdict

defaultdict 是 Python 内置的一个字典类,它继承了 dict 类型,和字典(dict)对象一样,支持所有的字典方法。但是 defaultdict 与 dict 有一个重要的区别:当所访问的key不存在的时候,defaultdict 会自动调用一个特殊的工厂函数来创建这个缺失的 key 对应的 value。

defaultdict的区别

当我们需要为字典中的值设置默认值的时候,通常的做法是先判断这个值是否存在,如果不存在则设置默认值,否则使用原本的值。这一过程需要写额外的代码,在 defaultdict 中,我们可以省去这些代码,从而更加简洁、方便的方式来操作字典中的默认值。

来看下面这个例子,我们需要按语言对学生进行分类:

students = [('Kim', 'Korean'), ('Alice', 'English'),
            ('Tom', 'English'), ('Jim', 'Korean'),
            ('Mike', 'English'), ('Andy', 'Korean')]

result = {}
for name, lang in students:
    if lang not in result:
        result[lang] = []
    result[lang].append(name)

print(result)
# 输出: {'Korean': ['Kim', 'Jim', 'Andy'], 'English': ['Alice', 'Tom', 'Mike']}

我们每次迭代的时候,都需要首先检查当前语言是否存在字典中,如果不存在,则需要先添加一个空列表作为默认值,这导致代码显得繁琐。

但是如果使用 defaultdict,则可以省去这些代码,如下所示:

from collections import defaultdict

students = [('Kim', 'Korean'), ('Alice', 'English'),
            ('Tom', 'English'), ('Jim', 'Korean'),
            ('Mike', 'English'), ('Andy', 'Korean')]

result = defaultdict(list)

for name, lang in students:
    result[lang].append(name)

print(result)
# 输出: defaultdict(<class 'list'>, {'Korean': ['Kim', 'Jim', 'Andy'], 'English': ['Alice', 'Tom', 'Mike']})

这个 defaultdict 类型是特殊的,在创建 defaultdict 对象时,可以传递一个函数作为参数。如果我们访问的字典键不存在,会根据这个函数返回一个默认值。

defaultdict的用法

为了更好的理解 defaultdict 的使用方法,我们来看看常用的 API。

defaultdict(default_factory)

  • defaultdict 是一个类,并且继承了字典类(dict)。
  • defaultdict 在初始化时,需要传递一个参数 default_factory,默认值是 None。default_factory 可以是一个可调用函数(callable),也可以是一个参数值,用于设置默认的 value 值。
  • 当 key 不存在的时候,default_factory 就会被调用,来返回一个默认值,从而避免 KeyError 异常的出现。
from collections import defaultdict

# 定义一个函数,用于设定默认值
def default_value():
    return 'N/A'

# 初始化 defaultdict
default_dict = defaultdict(default_value)
# 在访问不存在的键时将调用 default_value()
print(default_dict['k'])
# 输出: N/A

# 向字典中添加键值对
default_dict['name'] = 'Kim'
print(default_dict)
# 输出: defaultdict(<function default_value at 0x7feb9e61c158>, {'k': 'N/A', 'name': 'Kim'})

defaultdict其他API

在 defaultdict 中,除了前面所介绍的default_factory参数外,其余的 API 与字典(dict)是一样的。如下所示:

  • defaultdict.copy() 方法来实现深度拷贝。
  • defaultdict.update() 方法来对字典进行更新。
  • defaultdict.pop() 方法用于删除字典中指定的键。
  • defaultdict.clear() 方法用于清空字典中的所有元素。

defaultdict的示例

下面是一些 defaultdict 的示例,希望可以把使用技巧说得更加清晰。

defaultdict实现分组

from collections import defaultdict

# 定义源数据
raw_data = [
    {'year': 2020, 'month': 1, 'day': 1, 'value': 111},
    {'year': 2020, 'month': 1, 'day': 2, 'value': 112},
    {'year': 2020, 'month': 1, 'day': 3, 'value': 113},
    {'year': 2020, 'month': 2, 'day': 1, 'value': 121},
    {'year': 2020, 'month': 2, 'day': 2, 'value': 122},
    {'year': 2020, 'month': 3, 'day': 1, 'value': 131},
]

# 使用 defaultdict 对数据进行分组处理
result = defaultdict(list)
for item in raw_data:
    year, month = item['year'], item['month']
    key = f"{year}-{month}"
    result[key].append(item)

print(result)
# 输出: defaultdict(<class 'list'>, {'2020-1': [{'year': 2020, 'month': 1, 'day': 1, 'value': 111}, {'year': 2020, 'month': 1, 'day': 2, 'value': 112}, {'year': 2020, 'month': 1, 'day': 3, 'value': 113}], '2020-2': [{'year': 2020, 'month': 2, 'day': 1, 'value': 121}, {'year': 2020, 'month': 2, 'day': 2, 'value': 122}], '2020-3': [{'year': 2020, 'month': 3, 'day': 1, 'value': 131}]})

defaultdict实现计数

from collections import defaultdict

# 定义源字符串
source_str = "abbcacddc"

# 遍历每个字符,使用 defaultdict 统计每个字符出现次数
count_dict = defaultdict(int)
for char in source_str:
    count_dict[char] += 1

print(count_dict)
# 输出: defaultdict(<class 'int'>, {'a': 2, 'b': 2, 'c': 3, 'd': 2})

在这个示例中,我们首先定义了一个字符串 source_str,然后遍历其中的每个字符。使用 defaultdict 来统计每个字符出现的次数,最后得到的结果是一个字典,它的键是指定的字符,而值则是对应字符出现的次数。

总结

本文主要介绍了 defaultdict 处理字典时的用法和示例,对于那些需要快速处理字典或者需要使用默认值的场景,defaultdict 是一个不错的选择。如果你还不太熟悉如何使用 defaultdict,可以在实际项目中多使用,相信它将会为你省去不少代码量。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python defaultdict方法使用分析 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 使用Python文件读写,自定义分隔符(custom delimiter)

    当需要对大批量文本数据进行处理时,使用Python编程语言进行文件读写操作是非常便捷且高效的选择。Python中内置了用于读写文件的函数、模块和类,可以轻松地完成对文件的读取、写入、追加等操作。而自定义分隔符则可以帮助我们更好地处理数据,并快速解析文件中的数据。 以下是使用Python文件读写,自定义分隔符的攻略指南: 准备工作 在开始文件读写的操作前,需要…

    python 2023年6月3日
    00
  • python实现根据图标提取分类应用程序实例

    为了实现“python实现根据图标提取分类应用程序实例”的完整攻略,我们需要分为以下几步: 1. 收集图标 首先,我们需要找到要处理的应用程序的图标。我们可以在各个应用商店寻找应用程序的图标,或者直接在应用程序文件夹中找到图标文件。 2. 将图标转换为灰度图像 将图标转换为灰度图像有利于后续的图像处理。我们可以使用Python中的OpenCV库来实现图像转灰…

    python 2023年6月3日
    00
  • python实现数通设备tftp备份配置文件示例

    当需要备份网络设备的配置文件时,我们通常使用TFTP(Trivial File Transfer Protocol)。Python作为一种流行的编程语言,可以用于编写自动备份网络设备配置的脚本。下面,我将为您提供实现这种功能的完整攻略。 确定需求 在编写脚本之前,我们需要明确自己实现的目标和要求。在本例中,我们的目标是使用Python自动备份数通设备的配置文…

    python 2023年6月3日
    00
  • python文档字符串(函数使用说明)使用详解

    下面是详细的攻略: Python文档字符串(函数使用说明)使用详解 在Python中,文档字符串(docstring)是一种特殊的注释,用于描述函数、类、模块等的使用说明。文档字符串通常放在函数、类、模块的开头,用三个双引号或三个单引号括起来。本文将介绍Python文档字符串的使用方法,并提供两个示例说明。 Python文档字符串的格式 Python文档字符…

    python 2023年5月14日
    00
  • 浅谈python多线程和队列管理shell程序

    这里是关于“浅谈python多线程和队列管理shell程序”的完整攻略。 1. 什么是Python多线程和队列管理 Python是一种高级编程语言,具有易学易用、灵活性高等特点。多线程和队列管理则是Python中的两个非常重要的概念。 1.1 多线程 多线程指的是在一个程序中同时运行多个线程,实现多个任务同时进行,提高程序的运行效率。Python提供了thr…

    python 2023年5月18日
    00
  • Python 通过调用接口获取公交信息的实例

    当我们需要获取公交信息时,我们可以通过调用公交公司提供的数据接口来获取。本文将为大家介绍如何使用Python调用接口获取公交信息。 步骤一:获取API接口 首先,我们需要从公交公司获取数据接口的URL和接口参数。以“杭州公共交通总公司”提供的实时公交线路信息为例,数据获取步骤如下: 打开“杭州公交总公司”官网(http://www.hzbus.cn),点击“…

    python 2023年6月3日
    00
  • 如何在C#中使用只读的 Collections

    接下来我将为你详细讲解如何在 C# 中使用只读的 Collections。 什么是只读的 Collection 在 .NET 中,有许多不同类型的集合类。其中,只读的 Collection 是指一种不可修改的集合,即集合的“只读”方法中只存在读取操作,没有修改操作。这样做的好处是保证了一旦集合被创建后,它的内容将不会被修改。这在一些情况下是非常有用的,比如当…

    python 2023年6月3日
    00
  • 浅谈python中截取字符函数strip,lstrip,rstrip

    浅谈Python中截取字符函数strip,lstrip,rstrip Python中提供了三种截取字符串的方法:strip、lstrip和rstrip。 strip strip函数可以截取掉字符串两端的指定字符,默认是空格。常用于数据清洗和整理。下面是使用示例: text = ‘ hello ‘ print(text.strip()) # 输出 ‘hello…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部