Python中3种setdefault用法详解及代码示例,助你优雅处理字典键异常

这篇文章为大家带来的是关于 3 种 setdefault 的用法介绍(代码),具有一定的参考价值,有需求的朋友可以参考,希望能对你有所帮助。

Python中3种setdefault用法详解及代码示例,助你优雅处理字典键异常

当字典的 d[k]无法找到正确的键时,Python 会引发异常。那么,是否存在一种优雅的方式来避免这种情况呢?答案是肯定的。

index0.py 获取索引中单词出现的频率信息并写入列表,此过程未使用 dict.setdefault 方法。

#!/usr/bin/env python
# coding=utf-8
import sys, re
WORD_RE = re.compile(r'w+')
index = {}
打开(sys.argv[1])文件,使用编码'utf-8',并将其赋值给变量 fp 。
对于 line_no 和 line,通过 enumerate(fp, 1) 进行操作,即对 fp 进行枚举,从 1 开始计数,每一次循环得到一个索引值 line_no 和对应的行 line
在 line 中,对于 WORD_RE 找到的每个匹配项进行遍历。
match.group() 所得到的结果就是 word 。
column_no 等于 match.start()的值加 1 。
位置等于(行号,列号)
如果在字典 `index` 中能找到键 `word`,那么就将其对应的值赋给变量 `occurrences`,如果找不到,则将空列表 `[]` 赋给变量 `occurrences`。
将位置添加到 occurrences 列表中。
index 对于 word 的值为 occurrences 。
对于在按照大写字母排序后的索引中的每个单词:
    print(word, index[word])

登录后复制

zen.txt

Flat is better than nested.
Sparse is better than dense.
Readability counts.
特殊情况并非特殊到足以打破规则。
尽管实用性胜过纯粹性。
Unless explicitly silenced.
起初,那种方式可能并不明显,除非你是荷兰人。
Now is better than never.
虽然“永远”常常比“当下”更好。
如果实施起来难以解释,那它就是个糟糕的主意。
如果实施起来容易解释,那可能是个好主意。

登录后复制

执行 python3 index0.py zen.txt

a [(19, 48), (20, 53)]
虽然有(11, 1)、(16, 1)、(18, 1)这些情况。
ambiguity [(14, 16)]
and [(15, 23)]
are [(21, 12)]
aren [(10, 15)]
at [(16, 38)]
bad [(19, 50)]
存在 [(15, 14), (16, 27), (20, 50)] 这一情况。  有 [(15, 14), (16, 27), (20, 50)] 。  [(15, 14), (16, 27), (20, 50)] 是存在的。  具备 [(15, 14), (16, 27), (20, 50)] 。  [(15, 14), (16, 27), (20, 50)] 处于存在的状态。  存在着 [(15, 14), (16, 27), (20, 50)] 。  有这样的情况 [(15, 14), (16, 27), (20, 50)] 。  这种情况 [(15, 14), (16, 27), (20, 50)] 是存在的。  具备这样的 [(15, 14), (16, 27), (20, 50)] 。  [(15, 14), (16, 27), (20, 50)] 是具备的。  存在有 [(15, 14), (16, 27), (20, 50)] 。  有 [(15, 14), (16, 27), (20, 50)] 这一状况。  这种 [(15, 14), (16, 27), (20, 50)] 是存在的。  存在着这样的 [(15, 14), (16, 27), (20, 50)] 。  具备着 [(15, 14), (16, 27), (20, 50)] 。  [(15, 14), (16, 27), (20, 50)] 是具备着的。  存在有这样的 [(15, 14), (16, 27), (20, 50)] 。  有这种 [(15, 14), (16, 27), (20, 50)] 。  这种 [(15, 14), (16, 27), (20, 50)] 存在着。  具备这种 [(15, 14), (16, 27), (20, 50)] 。  [(15, 14), (16, 27), (20, 50)] 是具备这种的。  存在具备 [(15, 14), (16, 27), (20, 50)] 。  具备存在 [(15, 14), (16, 27), (20, 50)] 。  存在与 [(15, 14), (16, 27), (20, 50)] 相关。  具备与 [(15, 14), (16, 27), (20, 50)] 相关。  与 [(15, 14), (16, 27), (20, 50)] 存在相关。  与 [(15, 14), (16, 27), (20, 50)] 具备相关。  存在 [(15, 14), (16, 27), (20, 50)] 这一现象。  具备 [(15, 14), (16, 27), (20, 50)] 这一现象。  这种现象 [(15, 14), (16, 27), (20, 50)] 是存在的。  这种现象 [(15, 14), (16, 27), (20, 50)] 是具备的。  存在这种现象 [(15, 14), (16, 27), (20, 50)] 。  具备这种现象 [(15,
beats [(11, 23)]
Beautiful [(3, 1)]
更好的是(18, 25)。
break [(10, 40)]
by [(1, 20)]
cases [(10, 9)]
...

登录后复制

index.py 运用了 dict.setdefault 这一方法,仅用一行代码便解决了获取以及更新单词出现情况列表的问题。

#!/usr/bin/env python
# coding=utf-8
import sys, re
WORD_RE = re.compile(r'w+')
index = {}
打开 sys.argv[1] 文件,并且设置编码为 utf-8,然后将其赋值给 fp 。
从 1 开始,通过 enumerate 函数遍历 fp 中的每一行,同时获取行号 line_no 和行内容 line
在 line 中,对于 WORD_RE 找到的每一个匹配项 match 进行操作。
            word = match.group()
            column_no = match.start()+1
位置是由行号和列号组成的,即 (line_no, column_no) 。
如果 index 中存在键 word ,则获取其对应的值(若不存在则默认为空列表),然后将 location 添加到该列表中;如果 index 中不存在键 word ,则先为 word 创建一个空列表,再将 location 添加到该列表中。
对于单词 word ,按照索引 index 进行排序,排序的依据是将每个单词转换为大写形式后进行比较。
    print(word, index[word])

登录后复制

也就是说:

如果 my_dict 中存在键 key ,则直接在对应的值列表中添加 new_value ;如果 my_dict 中不存在键 key ,则先为键 key 创建一个空的列表,然后将 new_value 添加到该列表中。

登录后复制

等价于

if key not in my_dict:
    my_dict[key] = []
my_dict 中的 key 对应的列表添加了新的值 new_value 。

登录后复制

二者效果相同。setdefault 一次就能完成整个操作,而后者需要进行两次查询。

你可能想看:
« 上一篇
下一篇 »

相关推荐

python爬虫教程PDF,Python爬虫书PDF

2026年09月02日

31阅读

外国教程python,python编程教学视频

2026年09月02日

26阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

27阅读

python教程大全集,python教程600集

2026年09月02日

27阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

23阅读