[Python技巧]是时候用 defaultdict 和 Counter 代替 dictionary 了

本文介绍了Python中的defaultdict和Counter数据类型,它们可以替代传统的dictionary,提供更简洁、高效的代码。defaultdict允许设定默认值,Counter则用于统计元素出现次数。通过示例展示了如何使用它们来统计文本中单词频率,以及如何与其他数据结构结合使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在采用 dict 的时候,一般都需要判断键是否存在,如果不存在,设置一个默认值,存在则采取其他的操作,但这个做法其实需要多写几行代码,那么是否有更高效的写法,可以减少代码,但可读性又不会降低呢,毕竟作为程序员,我们都希望写出可用并且高效简洁的代码。

今天看到一篇文章,作者介绍可以使用 defaultdictCounter 来代替 dictionary 可以写出比更加简洁和可读性高的代码,因此今天就简单翻译这篇文章,并后续简单介绍这两种数据类型。

原文:

https://towardsdatascience.com/python-pro-tip-start-using-python-defaultdict-and-counter-in-place-of-dictionary-d1922513f747

关于字典的介绍,也可以查看我之前写的Python基础入门_2基础语法和变量类型

本文目录:

  • Counter 和 defaultdict
  • 为何要用 defaultdict 呢?
  • defaultdict 的定义和使用
  • Counter 的定义和使用

学习一门编程语言很简单,在学习一门新语言的时候,我会专注于以下顺序的知识点,并且开始用新语言写代码其实很简单:

  • 运算符和数据类型:+,-,int,float,str
  • 条件语句:if,else,case,switch
  • 循环语句:For,while
  • 数据结构:List,Array,Dict,Hashmaps
  • 定义函数

但能写代码和写出优雅高效的代码是两件事情,每种语言都有其独特的地方。

因此,一门编程语言的新手总是会写出比较过度的代码,比如,对于 Java 开发者,在学习 Python 后,要写一段实现对一组数字的求和代码,会是下面这样子:

x=[1,2,3,4,5]
sum_x = 0
for i in range(len(x)):
    sum_x+=x[i]

但对于一名 Python 老手来说,他的代码是:

sum_x = sum(x)

所以接下来会开启一个名为“Python Shorts”的系列文章,主要介绍一些 Python 提供的简单概念以及有用的技巧和使用例子,这个系列的目标就是写出高效并且可读的代码。

Counter 和 defaultdict

<think>好的,用户问的是“right = defaultdict(Counter)”是什么意思。之前用户已经问过导入Counterdefaultdict的代码,现在他们在问如何组合使用这两个类。我需要先回顾之前的对话,确保这次回答连贯。 首先,用户可能已经理解了Counterdefaultdict各自的用途,现在需要解释当它们一起使用时的情况。我应该先分解这个语句的结构,说明每个部分的作用,再给出具体的例子帮助理解。 用户可能对嵌套的数据结构不太熟悉,特别是当defaultdict的参数是另一个容器类型时。需要明确说明这里的defaultdict会以Counter作为默认工厂,也就是说,当访问一个不存在的键时,会自动创建一个Counter实例作为值。 接着,应用场景是关键。用户可能想知道在什么情况下会用到这样的结构,比如多层统计或者分组计数。例如,统计每个城市中不同商品的销售数量,这时候外层用城市作为键,内层用Counter来记录商品数量。 还要注意可能的误区,比如defaultdict普通dict的区别,以及Counter在这里如何自动初始化。可能需要提醒用户,这样的结构在访问不存在的键时不会报错,而是生成一个空的Counter,方便直接操作。 最后,给出一个具体的代码示例会很有帮助,让用户看到实际运行的结果,加深理解。同时,可以对比使用普通dict的情况,说明使用defaultdict(Counter)带来的便利性,比如减少初始化代码避免KeyError。</think>好的,我来逐步解释 `right = defaultdict(Counter)` 的含义用法: --- ### 1. **代码结构拆解** - `defaultdict`:是Python中「带默认值的字典」 - `Counter`:是用于「统计元素频率」的专用字典 - **组合含义**:创建一个字典 `right`,其中: - **每个不存在的键**会自动初始化一个空的 `Counter` 对象作为默认值 - **每个键对应的值**都是独立的 `Counter` 实例 --- ### 2. **类比理解** 可以想象成一种「嵌套字典」结构: ```python # 等效的普通字典写法(需手动初始化) right = {} right['key'] = Counter() # 手动给每个键分配Counter ``` 但使用 `defaultdict(Counter)` 的优势是: - **自动初始化**:访问不存在的键时,自动创建 `Counter` - **避免KeyError**:无需手动检查键是否存在 --- ### 3. **典型应用场景** 适合需要 **分组统计多层数据** 的场景,例如: - **统计每个班级的学生成绩分布** ```python from collections import defaultdict, Counter classes = defaultdict(Counter) # 添加数据:班级A中数学得90分的人数+1 classes['班级A']['数学'] += 1 classes['班级B']['英语'] += 1 ``` - **统计每个城市的不同商品销量** ```python sales = defaultdict(Counter) sales['北京']['手机'] += 5 sales['上海']['电脑'] += 3 ``` --- ### 4. **具体行为示例** ```python from collections import defaultdict, Counter # 创建结构 right = defaultdict(Counter) # 添加数据(自动初始化Counter) right['group1']['apple'] += 1 # group1不存在 → 自动创建Counter right['group1']['banana'] += 2 # 直接操作已存在的group1的Counter print(right['group1']) # 输出:Counter({'banana': 2, 'apple': 1}) print(right['group2']) # 访问不存在的group2 → 自动生成空Counter # 输出:Counter() ``` --- ### 5. **与普通字典的对比** | 操作 | `defaultdict(Counter)` | 普通字典 (`dict`) | |----------------------|------------------------------------------|------------------------------------------| | 访问不存在的键 | 自动创建`Counter`作为值 | 抛出`KeyError` | | 统计嵌套数据 | 直接操作内层`Counter` | 需手动检查并初始化内层字典 | | 内存效率 | 仅实际使用的键占用内存 | 需要预分配空间 | --- ### 6. **实际应用技巧** - **合并统计**:可通过 `Counter` 的 `update()` 方法合并数据 ```python right['group1'].update({'apple': 3, 'orange': 2}) ``` - **查看结果**:转换为普通字典格式 ```python print(dict(right)) # 外层字典结构可视化 ``` 如果遇到具体使用场景,可以进一步讨论如何优化代码结构!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

spearhead_cai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值