大数跨境
0
0

【Python】Python字典中常见的6个陷阱

【Python】Python字典中常见的6个陷阱 AI算法之道
2024-12-15
0
导读:Python中字典功能分享








01


引言





大家好,我是AI算法之道!


Python是我最喜欢的编程语言之一,它向来以其简单性、多功能性和可读性而闻名。而Python中的字典是 Python 语言最好的特性之一。它们快速、灵活、易于使用。



在使用 Python 字典多年后,我遇到过一些让我挠头的陷阱。以下是我遇到的最常见的错误,以及我是如何学会克服这些错误的。


闲话少说,我们直接开始吧!






02


使用可变的Keys


有一次,我试图使用一个列表作为字典的键,结果出现了 TypeError。就在那时,我学到了一条关键规则:

在字典中键必须是不可变的。

my_dict = {[1, 2, 3]: "value"}  # TypeError
如何改进?

使用元组代替列表或其他可变类型:

my_dict = {(1, 2, 3): "value"}  # Works perfectly



03


 不知不觉中修改key


这是一个经典问题。如果在字典中两次定义相同的键,那么只有最后一个值会被保留下来。
my_dict = {"name": "Alice", "name": "Bob"}  print(my_dict)  # Output: {'name': 'Bob'}

如何改进?

赋值时要谨慎,尤其是在键是动态的情况下。

快速检查可以节省数小时的调试时间:

if "name" not in my_dict:    my_dict["name"] = "Alice"else:    print("Key already exists!")





04


 迭代时修改字典


问题:在循环遍历字典中的元素时删除或添加键?

my_dict = {"a": 1, "b": 2, "c": 3}for key in my_dict:    if key == "b":        del my_dict[key]  # RuntimeError

上述代码,我们会触发 RuntimeError。在对字典进行迭代时修改字典,就像给行驶中的汽车换轮胎一样,并不明智。

如何改进?

诀窍在于遍历键的副本

for key in list(my_dict.keys()):    if key == "b":        del my_dict[key]

这样可以避免冲突,保持工作顺利进行。





05


忽略get()方法


问题:尝试访问字典中不存在的键时,会出现 KeyError。使用 get() 方法是一个更安全的选择,但也有经常用错的地方,如下

my_dict = {}value = my_dict.get("missing_key", [])value.append("new_value")  # This changes the list, but not the dictionary!print(my_dict)  # {}

上述代码中,我们并没有修改字典。


如何改进?

有意识地更新词典

my_dict = {}value = my_dict.get("missing_key", [])value.append("new_value")my_dict["missing_key"] = valueprint(my_dict)  # {'missing_key': ['new_value']}

或者,最好使用 collections.defaultdict:

from collections import defaultdictmy_dict = defaultdict(list)my_dict["missing_key"].append("new_value")






06


嵌套字典的访问


在访问或修改键时,处理深嵌套字典可能会令人头疼。一不小心,就会出现KeyError,如下:

nested_dict = {"user": {"name": {"first": "Alice"}}}print(nested_dict["user"]["name"]["last"])  # KeyError

如何改进?

对于可预测的结构,可使用 defaultdict 等工具:

from collections import defaultdictnested_dict = defaultdict(lambda: defaultdict(dict))nested_dict["user"]["name"]["first"] = "Alice"

要想获得更多的结构化输出,像 pydantic 或 jsonschema 这样的库是救星。






07


大型字典的性能


字典很高效,但并不神奇。在处理大型数据集时,粗心大意的操作可能会让事情变得一团糟。


如何修复?

  • 避免不必要的查找或迭代。
  • 使用生成器管理内存
  • 利用缓存进行重复操作。


Python 字典非常棒,但和其他工具一样,需要一些技巧才能掌握。这些陷阱告诉我,方法上的微小调整就能省去数小时的调试挫折。








08


总结


Python 是一种优雅的语言,但它也有自己的怪癖。了解了这些被误解的功能,大家就能编写出更简洁、更高效的代码,避免不必要的挫折。


请记住,掌握这些功能并非一蹴而就。拥抱不断学习的过程,大家就能不断地进步!







点击上方小卡片关注我




添加个人微信,进专属粉丝群!

【声明】内容源于网络
0
0
AI算法之道
一个专注于深度学习、计算机视觉和自动驾驶感知算法的公众号,涵盖视觉CV、神经网络、模式识别等方面,包括相应的硬件和软件配置,以及开源项目等。
内容 573
粉丝 0
AI算法之道 一个专注于深度学习、计算机视觉和自动驾驶感知算法的公众号,涵盖视觉CV、神经网络、模式识别等方面,包括相应的硬件和软件配置,以及开源项目等。
总阅读195
粉丝0
内容573