defaultdict 在python中的基本用法

 更新时间:2025年06月16日 17:22:34   作者:秋时的雨  
Python的collections.defaultdict是字典子类,自动处理缺失键并生成默认值(如int、list),简化代码逻辑,高效适用于计数、分组等场景,相比dict.setdefault更直观灵活,本文介绍defaultdict在python中的作用,感兴趣的朋友一起看看吧

collections.defaultdict 是 Python collections 模块中提供的一个字典(dict)的子类。它与普通的字典非常相似,但有一个关键的区别:当你尝试访问一个不存在的键时,defaultdict 不会引发 KeyError 异常,而是会自动为该键生成一个默认值。

defaultdict 的基本用法

defaultdict 的构造函数需要一个“默认工厂函数”(default_factory)作为参数。这个工厂函数是一个不接受任何参数的可调用对象,它会在访问不存在的键时被调用,并将其返回值作为该键的默认值。

from collections import defaultdict
# 使用 int 作为默认工厂函数,意味着当访问不存在的键时,会创建一个默认值为 0 的新条目。
# int() 会返回 0
word_counts = defaultdict(int)
# 访问一个不存在的键 'apple',它会自动创建并赋值为 int() 的结果 (0)
print(word_counts['apple'])  # 输出: 0
# 现在 'apple' 键存在了,我们可以像普通字典一样操作它
word_counts['apple'] += 1
print(word_counts['apple'])  # 输出: 1
word_counts['banana'] += 1
word_counts['apple'] += 1
print(word_counts)  # 输出: defaultdict(<class 'int'>, {'apple': 2, 'banana': 1})

为什么使用 defaultdict?

defaultdict 主要用于简化代码,避免在使用普通字典时频繁地检查键是否存在。这在以下场景中特别有用:

计数 (Counting): 统计列表中元素的出现次数,或字符串中字符的出现次数。

使用普通字典:

counts = {}
my_list = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
for item in my_list:
    if item in counts:
        counts[item] += 1
    else:
        counts[item] = 1
print(counts)

使用 defaultdict(int)

from collections import defaultdict
counts = defaultdict(int)
my_list = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
for item in my_list:
    counts[item] += 1  # 如果 'item' 不存在,会自动创建为 0,然后加 1
print(counts)

显然,defaultdict 的代码更简洁。

分组 (Grouping): 将具有相同特征的元素分组。例如,根据首字母将单词分组。

使用普通字典:

words_by_initial = {}
words = ['apple', 'banana', 'apricot', 'cat', 'dog']
for word in words:
    initial = word[0]
    if initial in words_by_initial:
        words_by_initial[initial].append(word)
    else:
        words_by_initial[initial] = [word]
print(words_by_initial)

使用 defaultdict(list)

from collections import defaultdict
words_by_initial = defaultdict(list)
words = ['apple', 'banana', 'apricot', 'cat', 'dog']
for word in words:
    initial = word[0]
    words_by_initial[initial].append(word) # 如果 'initial' 不存在,会自动创建为空列表 []
print(words_by_initial)

这里,list 作为默认工厂函数,当访问不存在的键时,会创建一个空列表。

累加/聚合 (Accumulating/Aggregating): 对某个键下的值进行累加或进行其他聚合操作。

假设你有一些销售数据,想要计算每个产品的总销售额:

from collections import defaultdict
sales_data = [
    {'product': 'A', 'amount': 100},
    {'product': 'B', 'amount': 50},
    {'product': 'A', 'amount': 75},
    {'product': 'C', 'amount': 200},
    {'product': 'B', 'amount': 120},
]
total_sales = defaultdict(float) # 或者 int,根据你的数据类型
for item in sales_data:
    product = item['product']
    amount = item['amount']
    total_sales[product] += amount
print(total_sales)
# 输出: defaultdict(<class 'float'>, {'A': 175.0, 'B': 170.0, 'C': 200.0})

defaultdict 的工厂函数

defaultdict 的 default_factory 可以是任何可调用对象,而不仅仅是内置类型(如 intlistset)。

int: 默认值为 0

d = defaultdict(int)
print(d['a']) # 0

list: 默认值为 []

d = defaultdict(list)
d['a'].append(1)
print(d) # defaultdict(<class 'list'>, {'a': [1]})

set: 默认值为 set()

d = defaultdict(set)
d['a'].add(1)
d['a'].add(2)
print(d) # defaultdict(<class 'set'>, {'a': {1, 2}})

str: 默认值为 ''

d = defaultdict(str)
print(d['a']) # ''

自定义函数:

def create_default_value():
    return "Not Found"
d = defaultdict(create_default_value)
print(d['unknown_key']) # Not Found

lambda 表达式:

d = defaultdict(lambda: {'count': 0, 'items': []})
d['product1']['count'] += 1
d['product1']['items'].append('item_x')
print(d['product1']) # {'count': 1, 'items': ['item_x']}

defaultdict 与 dict.setdefault() 的比较

在某些情况下,dict.setdefault() 也可以实现类似的功能,但 defaultdict 通常更简洁高效。

dict.setdefault(key, default_value) 方法会在字典中查找 key。如果 key 存在,则返回其对应的值;如果 key 不存在,则将 key 插入字典并赋值为 default_value,然后返回 default_value

使用 dict.setdefault() 进行计数:

counts = {}
my_list = ['apple', 'banana', 'apple']
for item in my_list:
    counts[item] = counts.setdefault(item, 0) + 1
print(counts) # {'apple': 2, 'banana': 1}

使用 dict.setdefault() 进行分组:

words_by_initial = {}
words = ['apple', 'banana', 'apricot']
for word in words:
    initial = word[0]
    words_by_initial.setdefault(initial, []).append(word)
print(words_by_initial) # {'a': ['apple', 'apricot'], 'b': ['banana']}

对比:

  • 简洁性defaultdict 在很多情况下代码更简洁,因为它省去了显式的条件判断或 setdefault 调用。
  • 性能: 对于大量操作,defaultdict 通常比重复调用 setdefault 稍微快一些,因为它避免了每次访问时都可能进行的键查找和方法调用开销。
  • 语义defaultdict 明确表达了“如果键不存在,就创建一个默认值”的意图,使得代码更易读。
  • 灵活性defaultdict 允许你指定一个工厂函数,而 setdefault 每次都需要提供一个具体的默认值。虽然 setdefault 也可以结合函数调用,但不如 defaultdict 的设计直接。

到此这篇关于defaultdict 在python中的作用的文章就介绍到这了,更多相关defaultdict python内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python list列表删除元素的4种方法

    Python list列表删除元素的4种方法

    本文主要介绍了Python list列表删除元素的4种方法,主要包括del、pop、remove、clear,具有一定的参考价值,感兴趣的可以了解一下
    2021-11-11
  • python2.7 安装pip的方法步骤(管用)

    python2.7 安装pip的方法步骤(管用)

    这篇文章主要介绍了python2.7 安装pip的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】

    python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】

    这篇文章主要介绍了python matplotlib模块基本图形绘制方法,结合实例形式总结分析了Python使用matplotlib模块绘制直线,曲线,直方图,饼图等图形的相关操作技巧,需要的朋友可以参考下
    2020-04-04
  • 利用Python模拟谷歌的小恐龙游戏

    利用Python模拟谷歌的小恐龙游戏

    谷歌流量器中有个很有名的彩蛋:当你网络出现问题时,就会出现一个“小恐龙游戏”。本文就主要为大家介绍了如何用Python模拟实现这一小游戏,感兴趣的同学可以学习一下
    2021-12-12
  • 使用Puppeteer爬取微信文章的实现

    使用Puppeteer爬取微信文章的实现

    这篇文章主要介绍了使用Puppeteer爬取微信文章的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • pyqt5与matplotlib的完美结合实例

    pyqt5与matplotlib的完美结合实例

    今天小编就为大家分享一篇pyqt5与matplotlib的完美结合实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • Python实现爬取逐浪小说的方法

    Python实现爬取逐浪小说的方法

    这篇文章主要介绍了Python实现爬取逐浪小说的方法,基于Python的正则匹配功能实现爬取小说页面标题、链接及正文等功能,需要的朋友可以参考下
    2015-07-07
  • 使用Flink与Python进行实时数据处理的基本步骤

    使用Flink与Python进行实时数据处理的基本步骤

    Apache Flink是一个流处理框架,用于实时处理和分析数据流,PyFlink是Apache Flink的Python API,它允许用户使用Python语言来编写Flink作业,进行实时数据处理,以下是如何使用Flink与Python进行实时数据处理的基本步骤,需要的朋友可以参考下
    2024-09-09
  • Pandas merge合并两个DataFram的实现

    Pandas merge合并两个DataFram的实现

    本文主要介绍了Pandas merge合并两个DataFram的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Pandas分组与排序的实现

    Pandas分组与排序的实现

    这篇文章主要介绍了Pandas分组与排序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07

最新评论