资讯专栏INFORMATION COLUMN

python3 setdefault的妙用

Enlightenment / 1316人阅读

摘要:当字典找不到正确的键时会抛出异常有没有一种优雅的方法来避免这种情况呢答案是肯定的从索引中获取单词出现的频率信息并写入列表没有使用执行使用了只用了一行就解决了获取和更新单词的出现情况列表也就是说等价于二者效果相同只是只

当字典 d[k]找不到正确的键时,Python会抛出异常,有没有一种优雅的方法来避免这种情况呢?答案是肯定的. index0.py 从索引中获取单词出现的频率信息,并写入列表 --没有使用dict.setdefault
#!/usr/bin/env python
# coding=utf-8
import sys, re

WORD_RE = re.compile(r"w+")

index = {}
with open(sys.argv[1], encoding="utf-8") as fp:
    for line_no, line in enumerate(fp, 1):
        for match in WORD_RE.finditer(line):
            word = match.group()
            column_no = match.start()+1
            location = (line_no, column_no)
            occurrences = index.get(word, [])
            occurrences.append(location)
            index[word] = occurrences

for word in sorted(index, key=str.upper):
    print(word, index[word])
zen.txt
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren"t special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you"re Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it"s a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let"s do more of those!
执行 python3 index0.py zen.txt
a [(19, 48), (20, 53)]
Although [(11, 1), (16, 1), (18, 1)]
ambiguity [(14, 16)]
and [(15, 23)]
are [(21, 12)]
aren [(10, 15)]
at [(16, 38)]
bad [(19, 50)]
be [(15, 14), (16, 27), (20, 50)]
beats [(11, 23)]
Beautiful [(3, 1)]
better [(3, 14), (4, 13), (5, 11), (6, 12), (7, 9), (8, 11), (17, 8), (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 = {}
with open(sys.argv[1], encoding="utf-8") as fp:
    for line_no, line in enumerate(fp, 1):
        for match in WORD_RE.finditer(line):
            word = match.group()
            column_no = match.start()+1
            location = (line_no, column_no)
            index.setdefault(word, []).append(location)

for word in sorted(index, key=str.upper):
    print(word, index[word])
也就是说:
my_dict.setdefault(key, []).append(new_value)
等价于
if key not in my_dict:
    my_dict[key] = []
my_dict[key].append(new_value)
二者效果相同,只是setdefault只需一次就完成整个操作,而后者需要进行两次查询

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42443.html

相关文章

  • Python3】基本数据类型-元祖(tuple)、字典(dict)

    摘要:元组元祖为不可被修改的列表,不可变类型基本操作索引切片循环长度包含以下为详细介绍查找元素个数获取元祖中第一个元素的索引位置字典根据值去对应的取不到值返回,不报错清空拷贝浅拷贝删除并获取对应的值随机删除键值对,并获取到删除的键值增加,如果值存 元组(tuple) 元祖为不可被修改的列表,不可变类型 基本操作: 索引 切片 循环 长度 包含 以下为详细介绍 ~ count 查找元素个...

    Honwhy 评论0 收藏0
  • Python Tricks 若干

    摘要:在代码中可以看到一些常见的,在这里做一个简单的小结。的妙用在某些场景下我们需要判断我们是否是从一个循环中跳出来的,并且只针对跳出的情况做相应的处理。这时候我们通常的做法是使用一个变量来标识是否是从循环中跳出的。 在 python 代码中可以看到一些常见的 trick,在这里做一个简单的小结。 json 字符串格式化 在开发 web 应用的时候经常会用到 json 字符串,但是一段比...

    lovXin 评论0 收藏0
  • Python数据结构:字典

    摘要:如果要把一个对象放入散列表,那么首先要计算这个元素的散列值。总结这一篇主要介绍了常见的字典方法如何处理查不到的键标准库中类型的变种散列表的工作原理散列表带来的潜在影响参考链接最后,感谢女朋友支持。 这一篇是《流畅的 python》读书笔记。主要介绍: 常见的字典方法 如何处理查不到的键 标准库中 dict 类型的变种 散列表的工作原理 泛映射类型 collections.abc...

    BlackFlagBin 评论0 收藏0
  • Python每日一练0007

    摘要:问题怎样实现一个键对应多个值的字典也叫例如解决方案使用模块中的类的特点是,当不存在时,会自动创建它,也就是说我们不用再像一样首先判断是否存在了,下面是一个例子当然,也可以用的函数来实现同样的效果,但看起来会比较丑陋讨论根据官方文档对的介绍可 问题 怎样实现一个键对应多个值的字典(也叫 multidict)? 例如: d = { a : [1, 2, 3], b : [4...

    i_garfileo 评论0 收藏0
  • Python3基础数据类型

    摘要:列表列表是中使用最频繁的数据类型。列表可以完成大多数集合类的数据结构实现。注意构造包含或个元素的元组的特殊语法规则。基本功能是进行成员关系测试和删除重复元素。以下几个内置的函数可以执行数据类型之间的转换。 一、说明 Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在 Python 中,变量就是变量,它没有类型,我们所说的类型是变量所指的内存中...

    Rindia 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<