Python应用中的默认字典

一、默认字典概述

在Python的collections模块中,有一种叫做defaultdict的数据结构,它是dict类的一个子类,它能够自动为字典中不存在的键提供默认值。

    from collections import defaultdict
    
    # 设置列表为默认值
    d = defaultdict(list)
    
    # 字典中没有key为"name"的键,则插入键"name",值为[],即一个空列表
    # 并将返回值作为这个列表的引用
    d["name"].append("John")

在默认字典中,如果访问字典中不存在的键,则默认会自动创建这个键并且对应的值是在创建defaultdict时所指定的默认值,最常见的情况就是使用列表为默认值。

二、默认字典的应用

默认字典的应用非常广泛,在以下几个方面,我们可以看到默认字典的强大和方便

1. 计数器Counter

Counter是collections模块中的一个计数器,它使用默认字典作为容器,用来计数相同元素出现的次数。

    from collections import Counter
    
    # 使用Counter统计列表中各元素出现的次数
    L = [1, 2, 1, 3, 2, 1, 2, 4, 5, 1]
    c = Counter(L)
    print(c)  # Counter({1: 4, 2: 3, 3: 1, 4: 1, 5: 1})

使用Counter的过程,实际上是为每个元素初始化一个默认值,并每次遍历到这个元素是增加计数器。

2. 节省代码行数

使用默认字典可以省去对键是否存在的判断,能大大减少代码行数。比如以下代码:

    # 对于每个键,统计它出现的次数,没有出现过则将次数初始化为0
    for key in keys:
        if key not in d:
            d[key] = 0
        d[key] += 1

这样的代码可以使用下面的代码来替代:

    for key in keys:
        d[key] += 1

3. 容器嵌套

在容器嵌套的情况下,使用默认字典可以避免键映射到不存在的值的情况,从而使代码更为紧凑。

    # 学生成绩均分统计(d为默认字典,可以方便地追加学生成绩)
    d = defaultdict(list)
    for name, score in scores:
        d[name].append(score)

    # 输出每位学生平均分
    for name, scores in d.items():
        avg_score = sum(scores) / len(scores)
        print(f"{name}: {avg_score}")

三、默认字典的用法

虽然默认字典非常便利实用,但是需要注意以下几个问题:

1. 默认值需要可迭代

当我们使用默认字典来创建一个默认空列表的时候,在将这个列表元素加入到默认字典中时,需要的是一个可迭代的对象。

    from collections import defaultdict
    
    d = defaultdict(list)
    d["name"].append("John")  # 正确
    d["name"].append("Mike")  # 正确

    d["name"] = "John"  # 错误,字符串不可迭代

2. 默认值的函数要注意副作用

在使用默认值函数时,需要注意函数是否有副作用,建议使用lambda表达式。

    # 正确方式:不具有副作用的lambda表达式
    d = defaultdict(lambda: [])

    # 错误方式:具有副作用的函数
    def foo():
        print("hello")
        return []
    d = defaultdict(foo)
    d[1]  # 输出"hello",并返回一个空列表
    d[2]  # 输出"hello",并返回一个空列表

3. 默认值函数的应用

我们可以任意定制默认值函数,比如追踪创建了哪些键:

    def key_tracker():
        c = []
        def tracker():
            c.append(len(c))
            return []
        return tracker

    tracker = key_tracker()
    d = defaultdict(tracker)

    _ = d["name1"]
    _ = d["name2"]
    _ = d["name3"]

    print(tracker())  # [0, 1, 2]

四、总结

Python中的默认字典可谓是一个功能强大且便捷实用的数据结构,它大大了简化了容器中键的初始化和增加操作。在实际的Python开发中,我们可以充分发挥其威力,优化代码,简化程序逻辑。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/284686.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-22 15:41
下一篇 2024-12-22 15:42

相关推荐

  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python周杰伦代码用法介绍

    本文将从多个方面对Python周杰伦代码进行详细的阐述。 一、代码介绍 from urllib.request import urlopen from bs4 import Bea…

    编程 2025-04-29
  • 如何查看Anaconda中Python路径

    对Anaconda中Python路径即conda环境的查看进行详细的阐述。 一、使用命令行查看 1、在Windows系统中,可以使用命令提示符(cmd)或者Anaconda Pro…

    编程 2025-04-29
  • Python计算阳历日期对应周几

    本文介绍如何通过Python计算任意阳历日期对应周几。 一、获取日期 获取日期可以通过Python内置的模块datetime实现,示例代码如下: from datetime imp…

    编程 2025-04-29
  • Python列表中负数的个数

    Python列表是一个有序的集合,可以存储多个不同类型的元素。而负数是指小于0的整数。在Python列表中,我们想要找到负数的个数,可以通过以下几个方面进行实现。 一、使用循环遍历…

    编程 2025-04-29
  • Python字典去重复工具

    使用Python语言编写字典去重复工具,可帮助用户快速去重复。 一、字典去重复工具的需求 在使用Python编写程序时,我们经常需要处理数据文件,其中包含了大量的重复数据。为了方便…

    编程 2025-04-29
  • Python清华镜像下载

    Python清华镜像是一个高质量的Python开发资源镜像站,提供了Python及其相关的开发工具、框架和文档的下载服务。本文将从以下几个方面对Python清华镜像下载进行详细的阐…

    编程 2025-04-29
  • Python程序需要编译才能执行

    Python 被广泛应用于数据分析、人工智能、科学计算等领域,它的灵活性和简单易学的性质使得越来越多的人喜欢使用 Python 进行编程。然而,在 Python 中程序执行的方式不…

    编程 2025-04-29
  • python强行终止程序快捷键

    本文将从多个方面对python强行终止程序快捷键进行详细阐述,并提供相应代码示例。 一、Ctrl+C快捷键 Ctrl+C快捷键是在终端中经常用来强行终止运行的程序。当你在终端中运行…

    编程 2025-04-29
  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29

发表回复

登录后才能评论