PYTHON基础技能 – Python中9个常见字典与异常处理错误与解决方案

释放双眼,带上耳机,听听看~!

第一部分:字典基础与常见错误

1. 创建字典的误解

错误场景:尝试用列表推导式创建字典时,键重复导致覆盖。


1
<em>#&nbsp;错误示范</em><br>keys&nbsp;=&nbsp;&#091;'a',&nbsp;'b',&nbsp;'a']<br>values&nbsp;=&nbsp;&#091;1,&nbsp;2,&nbsp;3]<br>my_dict&nbsp;=&nbsp;{k:&nbsp;v&nbsp;for&nbsp;k,&nbsp;v&nbsp;in&nbsp;zip(keys,&nbsp;values)}<br>print(my_dict)&nbsp;&nbsp;<em>#&nbsp;输出可能不是预期,因为'a'键被覆盖了</em>

解决方案:使用

1
collections.defaultdict

避免键冲突。


1
from&nbsp;collections&nbsp;import&nbsp;defaultdict<br><br>my_dict&nbsp;=&nbsp;defaultdict(list)<br>for&nbsp;k,&nbsp;v&nbsp;in&nbsp;zip(keys,&nbsp;values):<br>&nbsp;&nbsp;&nbsp;&nbsp;my_dict&#091;k].append(v)<br>print(my_dict)&nbsp;&nbsp;<em>#&nbsp;{'a':&nbsp;&#091;1,&nbsp;3],&nbsp;'b':&nbsp;&#091;2]}</em>

2. 字典访问未初始化键

错误场景


1
my_dict&nbsp;=&nbsp;{}<br>value&nbsp;=&nbsp;my_dict&#091;'not_here']&nbsp;&nbsp;<em>#&nbsp;KeyError</em>

解决方案:使用

1
get

方法安全访问。


1
value&nbsp;=&nbsp;my_dict.get('not_here',&nbsp;'默认值')<br>print(value)&nbsp;&nbsp;<em>#&nbsp;输出&nbsp;'默认值'</em>

3. 字典更新时的键冲突

错误理解


1
dict1&nbsp;=&nbsp;{'x':&nbsp;1}<br>dict2&nbsp;=&nbsp;{'x':&nbsp;2,&nbsp;'y':&nbsp;3}<br>dict1.update(dict2)<br><em>#&nbsp;预期dict1中'x'的值不变</em>

正确做法:更新操作会覆盖键值。


1
print(dict1)&nbsp;&nbsp;<em>#&nbsp;{'x':&nbsp;2,&nbsp;'y':&nbsp;3}&nbsp;注意'x'的值已被覆盖</em>

异常处理入门

4. 不处理异常的危险

问题:运行时错误未被捕获。


1
num&nbsp;=&nbsp;'one'<br>result&nbsp;=&nbsp;num&nbsp;+&nbsp;1&nbsp;&nbsp;<em>#&nbsp;TypeError</em>

引入try-except


1
try:<br>&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;num&nbsp;+&nbsp;1<br>except&nbsp;TypeError:<br>&nbsp;&nbsp;&nbsp;&nbsp;print("不能将字符串与数字相加")

5. 使用finally清理资源

无论是否发生异常,

1
finally

块都会执行。


1
try:<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;假设这是打开文件的操作</em><br>&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;=&nbsp;open('example.txt',&nbsp;'r')<br>&nbsp;&nbsp;&nbsp;&nbsp;print(file.read())<br>except&nbsp;FileNotFoundError:<br>&nbsp;&nbsp;&nbsp;&nbsp;print("文件不存在")<br>finally:<br>&nbsp;&nbsp;&nbsp;&nbsp;file.close()&nbsp;&nbsp;<em>#&nbsp;确保文件被关闭</em>

第二部分:高级技巧与实战案例

6. 字典推导式的高级用法

高级示例:创建一个映射,将字符串转换为它们的长度。


1
words&nbsp;=&nbsp;&#091;'apple',&nbsp;'banana',&nbsp;'cherry']<br>lengths&nbsp;=&nbsp;{word:&nbsp;len(word)&nbsp;for&nbsp;word&nbsp;in&nbsp;words}<br>print(lengths)&nbsp;&nbsp;<em>#&nbsp;{'apple':&nbsp;5,&nbsp;'banana':&nbsp;6,&nbsp;'cherry':&nbsp;6}</em>

7. Python 3.5+:字典解构合并

新特性:利用解构简化字典合并。


1
dict1&nbsp;=&nbsp;{'x':&nbsp;1,&nbsp;'y':&nbsp;2}<br>dict2&nbsp;=&nbsp;{'y':&nbsp;3,&nbsp;'z':&nbsp;4}<br>merged&nbsp;=&nbsp;{**dict1,&nbsp;**dict2}&nbsp;&nbsp;<em>#&nbsp;Python&nbsp;3.5+</em><br>print(merged)&nbsp;&nbsp;<em>#&nbsp;{'x':&nbsp;1,&nbsp;'y':&nbsp;3,&nbsp;'z':&nbsp;4}</em>

8. 异常链:提供更详细的错误信息

深入异常处理


1
try:<br>&nbsp;&nbsp;&nbsp;&nbsp;raise&nbsp;ValueError("Something&nbsp;wrong!")<br>except&nbsp;ValueError&nbsp;as&nbsp;ve:<br>&nbsp;&nbsp;&nbsp;&nbsp;raise&nbsp;KeyError("This&nbsp;happened&nbsp;because&nbsp;of&nbsp;a&nbsp;value&nbsp;error.")&nbsp;from&nbsp;ve

这样可以保留原始异常信息,增强调试能力。

9. 自定义异常

提升代码质量


1
class&nbsp;CustomError(Exception):<br>&nbsp;&nbsp;&nbsp;&nbsp;pass<br><br>try:<br>&nbsp;&nbsp;&nbsp;&nbsp;raise&nbsp;CustomError("这是一个自定义错误")<br>except&nbsp;CustomError&nbsp;as&nbsp;ce:<br>&nbsp;&nbsp;&nbsp;&nbsp;print(ce)

实战案例:数据分析预处理

假设我们需要处理一份数据,其中包含一个字典列表,每个字典代表一条记录,但数据不完全或有格式错误。我们的任务是清洗数据,处理缺失值,并捕获任何转换过程中的异常。


1
data&nbsp;=&nbsp;&#091;<br>&nbsp;&nbsp;&nbsp;&nbsp;{"name":&nbsp;"Alice",&nbsp;"age":&nbsp;30},<br>&nbsp;&nbsp;&nbsp;&nbsp;{"name":&nbsp;"Bob",&nbsp;"missed_age":&nbsp;25},&nbsp;&nbsp;<em>#&nbsp;错误键名</em><br>&nbsp;&nbsp;&nbsp;&nbsp;{"name":&nbsp;"Charlie"},&nbsp;&nbsp;<em>#&nbsp;缺失年龄</em><br>]<br><br>cleaned_data&nbsp;=&nbsp;&#091;]<br><br>for&nbsp;record&nbsp;in&nbsp;data:<br>&nbsp;&nbsp;&nbsp;&nbsp;try:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;确保记录中有'age'键</em><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;age&nbsp;=&nbsp;record.get('age',&nbsp;None)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;age&nbsp;is&nbsp;None:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise&nbsp;ValueError("Age&nbsp;is&nbsp;missing.")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;正确处理记录</em><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cleaned_record&nbsp;=&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"name":&nbsp;record&#091;"name"],<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"age":&nbsp;int(age),&nbsp;&nbsp;<em>#&nbsp;强制类型转换,可能引发ValueError</em><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cleaned_data.append(cleaned_record)<br>&nbsp;&nbsp;&nbsp;&nbsp;except&nbsp;KeyError&nbsp;as&nbsp;ke:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"Key&nbsp;error&nbsp;in&nbsp;record:&nbsp;{ke}")<br>&nbsp;&nbsp;&nbsp;&nbsp;except&nbsp;ValueError&nbsp;as&nbsp;ve:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"Value&nbsp;error&nbsp;in&nbsp;record:&nbsp;{ve}")<br><br>print(cleaned_data)

在这个实战案例中,我们结合了字典操作和异常处理,展示了如何优雅地处理数据清洗过程中常见的问题。通过使用try-except结构,我们能够捕获并妥善处理异常,保证程序的健壮性。

给TA打赏
共{{data.count}}人
人已打赏
安全运维

安全运维之道:发现、解决问题的有效闭环

2024-4-14 20:59:36

安全运维

稳定性建设 – 架构优化的关键策略

2025-2-11 17:15:56

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索