流程的python阅读笔记-第三章·字典和集合

如何自动处理缺失的键

前提引入:在对文本分析处理时,我们经常会遇到数据缺失的情况,尤其是当处理结构化或半结构化的文本数据时,某些键(key)可能缺失。例如,在处理JSON、YAML或字典格式的数据时,某些键可能不存在,这会导致程序在访问这些键时抛出异常或产生错误。

python提供了以下几种解决方法:

1.使用dict.get()方法

data = {"name":"Alice","age":30}
# 使用get方法,如果键不存在,返回设置的默认值
address = data.get("address","Beijing")

2.使用collections.defaultdict

collections.defaultdict 是 Python 标准库中的一个类,它允许你为字典设置一个默认值工厂函数。当访问不存在的键时,它会自动调用这个工厂函数来生成默认值。

from collections import defaultdict

# 设置默认值为 "Unknown"
data = defaultdict(lambda: "Unknown", {"name": "Alice", "age": 30})

# 访问不存在的键
address = data["address"]
print(address)  # 输出: Unknown

3.使用setdefault()方法

setdefault() 方法可以在键不存在时设置一个默认值,并返回该值。如果键存在,则返回键对应的值。

data = {"name": "Alice", "age": 30}

# 如果键不存在,设置默认值并返回
address = data.setdefault("address", "Unknown")
print(address)  # 输出: Unknown
print(data)  # 输出: {'name': 'Alice', 'age': 30, 'address': 'Unknown'}

4.使用自定义类

dict类在使用get方法找不到键会抛出异常的原因是没有定义__missing__魔术方法,字典处理缺失键的底层逻辑在__missing__方法,当__getitem__找不到键时将调用__missing__方法
我们可以自定一个类继承dict基类,来进行自动处理缺失值

class DefaultDict(dict):
    def __missing__(self, key):
        return "Unknown"

data = DefaultDict({"name": "Alice", "age": 30})

# 访问不存在的键
address = data["address"]
print(address)  # 输出: Unknown

在我们实际使用中,最好继承UserDict类而不是dict类
有以下几点原因:

  • dict类某些方法不会调用__missing__
  • collections.UserDict 是一个专门为自定义字典设计的类。它将实际的字典存储在一个名为 data 的属性中,并确保所有操作都通过自定义方法进行。这样可以避免 dict 类的某些内置方法绕过自定义逻辑。

最后用mermaid语法清晰讲述一下这些知识点

graph LR
A[缺失值自动处理] --> B[dict.get方法]
A --> C[defaultdict类]
A --> D[自定义字典类]
A --> E[try-except捕获异常]
A --> F[setdefault方法]

B --> G[功能: 返回默认值]
B --> H[优点: 简单易用]
B --> I[缺点: 不自动添加缺失键]

C --> J[功能: 自动调用工厂函数生成默认值]
C --> K[优点: 自动添加缺失键]
C --> L[缺点: 需要提前设置默认值工厂]

D --> M[功能: 自定义__missing__方法]
D --> N[优点: 完全控制行为]
D --> O[缺点: 需要额外代码]

E --> P[功能: 捕获KeyError异常]
E --> Q[优点: 灵活处理]
E --> R[缺点: 代码冗长]

F --> S[功能: 设置并返回默认值]
F --> T[优点: 自动添加缺失键]
F --> U[缺点: 仅适用于简单场景]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值