首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第4章 选择易懂的名称
4.1 命名风格
4.2 PEP 8 的命名风格
4.3 适当的名称长度
4.3.1 太短的名称
4.3.2 太长的名称
4.4 起易于搜索的名称
4.5 避免笑话、双关语和需要文化背景才能理解的词汇
4.6 不要覆盖内置名称
4.7 史上最差的变量名
第5章 揪出代码的坏味道
5.1 重复的代码
5.2 魔数
5.3 注释掉的代码和死代码
5.4 打印调试
5.5 带有数字后缀的变量
5.6 本该是函数或者模块的类
5.7 嵌套列表解析式
5.8 空的except块和糟糕的错误信息
5.9 代码坏味道的谬误
5.9.1 谬误:函数应该仅在末尾处有一个return语句
5.9.2 谬误:函数最多只能有一个try语句
5.9.3 谬误:使用flag参数不好
5.9.4 谬误:全局变量不好
5.9.5 谬误:注释是不必要的
第6章 编写Python 风格的代码
6.1 Python 之禅
6.2 学着喜欢强制缩进
6.3 使用timeit模块衡量性能
6.4 常被误用的语法
6.4.1 使用enumerate()而不是range()
6.4.2 使用with 语句代替open()和close()
6.4.3 用is 跟None 做比较而不用==
6.5 格式化字符串
6.5.1 如果字符串有很多反斜杠,请使用原始字符串
6.5.2 使用f-string 格式化字符串
6.6 制作列表的浅副本
6.7 以Python 风格使用字典
6.7.1 在字典中使用get()和setdefault()
6.7.2 使用collections.defaultdict()设置默认值
6.7.3 使用字典代替switch 语句
6.8 条件表达式:Python“丑陋”的三元运算符
6.9 处理变量的值
6.9.1 链式赋值和比较运算符
6.9.2 验证变量是否为多个值中的一个
当前位置:
首页>>
技术小册>>
Python编程轻松进阶(二)
小册名称:Python编程轻松进阶(二)
### 6.7.2 使用`collections.defaultdict()`设置默认值 在Python编程中,处理数据集合时经常需要为字典(dictionary)的键(key)设置默认值,以便在访问不存在的键时能够返回一个预设的值,而不是引发`KeyError`异常。Python标准库中的`collections`模块提供了一个非常有用的类——`defaultdict`,它正是为了这个目的而设计的。`defaultdict`是字典的一个子类,它接受一个工厂函数作为第一个参数,用于为字典中不存在的键提供默认值。 #### 6.7.2.1 `defaultdict`的基本用法 首先,我们需要从`collections`模块中导入`defaultdict`类。然后,在创建`defaultdict`实例时,指定一个工厂函数作为参数,这个函数不接受任何参数并返回一个值,这个值将作为字典中不存在键的默认值。 ```python from collections import defaultdict # 使用int作为工厂函数,为不存在的键提供默认值0 dd = defaultdict(int) # 访问不存在的键,将自动返回0 print(dd['a']) # 输出: 0 # 也可以正常添加键值对 dd['b'] = 1 print(dd['b']) # 输出: 1 # 再次访问不存在的键,仍然返回0 print(dd['c']) # 输出: 0 ``` 在这个例子中,`defaultdict(int)`创建了一个字典,其中所有不存在的键都将默认返回整数`0`。 #### 6.7.2.2 使用不同类型的工厂函数 `defaultdict`的灵活性在于它可以接受任何不接受参数并返回值的函数作为工厂函数。这意味着你可以根据需要为字典的默认值设置各种类型。 ##### 列表作为默认值 ```python from collections import defaultdict # 使用list作为工厂函数,为不存在的键提供空列表 dd_list = defaultdict(list) # 访问不存在的键,将自动返回[] print(dd_list['x']) # 输出: [] # 向列表中添加元素 dd_list['x'].append(1) print(dd_list['x']) # 输出: [1] ``` ##### 集合作为默认值 ```python from collections import defaultdict # 使用set作为工厂函数,为不存在的键提供空集合 dd_set = defaultdict(set) # 访问不存在的键,将自动返回set() print(dd_set['y']) # 输出: set() # 向集合中添加元素 dd_set['y'].add('a') print(dd_set['y']) # 输出: {'a'} ``` ##### 自定义对象作为默认值 ```python from collections import defaultdict class MyClass: def __init__(self, value=0): self.value = value # 使用MyClass作为工厂函数(注意:这里需要lambda来绕过默认参数问题) dd_obj = defaultdict(lambda: MyClass()) # 访问不存在的键,将自动返回MyClass的实例 print(dd_obj['z'].value) # 输出: 0 # 修改对象的属性 dd_obj['z'].value = 10 print(dd_obj['z'].value) # 输出: 10 ``` 注意,在上面的`MyClass`例子中,由于`defaultdict`的工厂函数不接受参数,而`MyClass`的构造函数有一个默认参数,我们使用了`lambda`表达式来绕过这个问题,直接返回一个`MyClass`的实例(使用默认参数)。 #### 6.7.2.3 `defaultdict`在数据处理中的应用 `defaultdict`在数据处理中非常有用,特别是在处理具有嵌套结构的数据时。例如,在处理文本数据并统计每个单词在每个句子中出现的次数时,可以使用`defaultdict`来简化代码。 ```python from collections import defaultdict text = "This is a test. This test is only a test." words = text.lower().split() # 使用defaultdict(dict)来统计每个单词在每个句子中的出现次数 # 假设句子以句号分隔 sentences = text.split('.') word_counts = defaultdict(dict) sentence_index = 0 for word in words: if word.strip() == '': # 跳过空字符串(如句子间的空格) sentence_index += 1 continue word_counts[sentence_index][word] = word_counts[sentence_index].get(word, 0) + 1 # 打印结果 for sentence_id, counts in word_counts.items(): print(f"Sentence {sentence_id+1}: {counts}") ``` 注意:上面的代码示例为了简化说明,没有直接处理标点符号分割句子的复杂性(如缩写、句子末尾的标点符号多样性等)。在实际应用中,可能需要使用更复杂的逻辑来准确分割句子。 #### 6.7.2.4 注意事项 - **性能考虑**:虽然`defaultdict`提供了便利,但在性能敏感的应用中,应谨慎使用。特别是当工厂函数创建的对象较为复杂或重量级时,频繁地创建这些对象可能会对性能产生影响。 - **与`dict.get()`方法的比较**:`dict.get(key, default)`方法也可以用来获取字典中键的值,如果键不存在则返回默认值。然而,`defaultdict`在处理需要频繁添加新键的场景时更为高效和方便。 - **工厂函数的选择**:选择适当的工厂函数对于`defaultdict`的使用至关重要。错误的工厂函数可能导致意外的行为或性能问题。 总之,`collections.defaultdict`是Python中一个非常有用的工具,它通过提供默认值来简化字典操作,使得在处理复杂数据结构时更加灵活和高效。通过合理利用`defaultdict`,你可以编写出更加简洁、易读且高效的代码。
上一篇:
6.7.1 在字典中使用get()和setdefault()
下一篇:
6.7.3 使用字典代替switch 语句
该分类下的相关小册推荐:
Selenium自动化测试实战
Python合辑12-面向对象
Python合辑9-判断和循环
剑指Python(磨刀不误砍柴工)
Python合辑4-130个字符串操作示例
Python合辑11-闭包函数
Python编程轻松进阶(四)
Python合辑7-集合、列表与元组
Python自动化办公实战
Python机器学习基础教程(下)
Python与办公-玩转Word
Python合辑10-函数