1、价值上万元的专业的PPT报告模板。
2、专业案例分析和解读笔记。
3、实用的Excel、Word、PPT技巧。
4、VIP讨论群,共享资源。
5、优惠的会员商品。
6、一次付费只需99元,即可下载本站文章涉及的文件和软件。
在 Python 的标准库中,collections
模块提供了许多强大的数据结构,其中 defaultdict
是一个非常实用的工具。defaultdict
继承自内置的 dict
类型,它可以在访问不存在的键时自动提供默认值,这一特性使得处理复杂的数据结构变得更加简单和直观。在这篇文章中,我将详细介绍 defaultdict
的使用方法和应用场景,并通过代码示例帮助理解它的强大功能。
defaultdict
的工作原理与普通的字典类似,但它允许你为不存在的键设置一个默认值。创建一个 defaultdict
对象时,需要传入一个工厂函数,这个函数返回你希望在访问不存在的键时使用的默认值。这样,当你试图访问一个不存在的键时,defaultdict
会自动调用工厂函数并使用其返回值来填充缺失的项,而不会引发 KeyError
异常。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
from collections import defaultdict # 创建一个 defaultdict,默认值为整数 0 dd = defaultdict( int ) # 添加一些键值对 dd[ 'apple' ] = 10 dd[ 'banana' ] = 5 # 访问存在的键 print (dd[ 'apple' ]) # 输出: 10 # 访问不存在的键,自动创建键并设置默认值 0 print (dd[ 'orange' ]) # 输出: 0 # 打印 defaultdict 对象的内容 print (dd) # 输出: defaultdict(<class 'int'>, {'apple': 10, 'banana': 5, 'orange': 0}) |
解释: defaultdict(int)
创建了一个 defaultdict
对象,其中 int
是一个工厂函数,返回 0。访问已存在的键时,defaultdict
会返回对应的值。访问不存在的键时,defaultdict
会调用 int()
函数,返回默认值 0。
defaultdict
可以使用各种工厂函数来生成默认值。例如,可以使用 list
工厂函数来创建一个默认值为列表的 defaultdict
。
1
2
3
4
5
6
7
8
9
10
11
12
|
from collections import defaultdict # 创建一个 defaultdict,默认值为空列表 dd = defaultdict( list ) # 添加一些键值对 dd[ 'fruits' ].append( 'apple' ) dd[ 'fruits' ].append( 'banana' ) dd[ 'vegetables' ].append( 'carrot' ) # 打印 defaultdict 对象的内容 print (dd) # 输出: defaultdict(<class 'list'>, {'fruits': ['apple', 'banana'], 'vegetables': ['carrot']}) |
解释: defaultdict(list)
创建了一个 defaultdict
对象,其中 list
是一个工厂函数,返回一个空列表。当访问不存在的键时,defaultdict
会自动创建一个空列表作为默认值。这对于将多个值归类到相同的键下非常有用。
使用 defaultdict
进行计数是一种常见的应用场景。例如,计算字符串中每个字符出现的次数。
1
2
3
4
5
6
7
8
9
10
|
from collections import defaultdict text = "hello world" char_count = defaultdict( int ) for char in text: char_count[char] + = 1 # 打印字符计数结果 print ( dict (char_count)) # 输出: {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1} |
解释: defaultdict(int)
被用来计数字符串 text
中每个字符的出现次数。每次访问字符时,defaultdict
会自动初始化计数器为 0,然后加 1。这种方式使得计数操作变得非常简洁。
defaultdict
也可以用来对数据进行分组。例如,将数据按类别进行分组并存储在列表中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
from collections import defaultdict data = [ ( 'fruit' , 'apple' ), ( 'fruit' , 'banana' ), ( 'vegetable' , 'carrot' ), ( 'fruit' , 'orange' ), ( 'vegetable' , 'broccoli' ) ] grouped_data = defaultdict( list ) for category, item in data: grouped_data[category].append(item) # 打印分组后的数据 print ( dict (grouped_data)) # 输出: {'fruit': ['apple', 'banana', 'orange'], 'vegetable': ['carrot', 'broccoli']} |
解释: defaultdict(list)
用于将数据按类别进行分组。每次遇到一个新的类别时,defaultdict
会自动创建一个空列表,然后将项追加到该列表中。这种方法在处理分类数据时非常高效。
有时需要创建多层嵌套的字典结构。可以使用 defaultdict
创建嵌套字典来实现这一点。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
from collections import defaultdict # 创建一个嵌套的 defaultdict nested_dd = defaultdict( lambda : defaultdict( int )) # 添加数据 nested_dd[ '2024' ][ 'January' ] = 5 nested_dd[ '2024' ][ 'February' ] = 8 nested_dd[ '2025' ][ 'January' ] = 3 # 打印嵌套的 defaultdict 对象 print ( dict (nested_dd)) # 输出: {'2024': {'January': 5, 'February': 8}, '2025': {'January': 3}} |
解释: 在这个示例中,使用了一个 lambda
函数来创建嵌套的 defaultdict
。外层 defaultdict
的默认值是另一个 defaultdict(int)
,这使得可以创建一个多层嵌套的字典结构。这样可以方便地组织复杂的数据层次。
除了使用内置的工厂函数,还可以定义自定义的默认值生成函数。例如,可以创建一个 defaultdict
,其默认值为自定义的对象或计算结果。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
from collections import defaultdict class CustomObject: def __init__( self , value): self .value = value def __repr__( self ): return f "CustomObject(value={self.value})" def default_value(): return CustomObject( "default" ) # 创建一个 defaultdict,默认值为 CustomObject 对象 custom_dd = defaultdict(default_value) # 访问不存在的键 print (custom_dd[ 'key' ]) # 输出: CustomObject(value=default) # 打印 defaultdict 对象的内容 print (custom_dd) # 输出: defaultdict(<function default_value at ...>, {'key': CustomObject(value=default)}) |
解释: 在这个示例中,定义了一个 CustomObject
类,并创建了一个 defaultdict
,其默认值为 CustomObject
实例。通过自定义的 default_value
函数,defaultdict
可以创建具有特定属性的默认对象。
defaultdict
是一个非常强大的工具,在处理字典数据结构时可以显著简化代码和提高效率。它不仅能够自动提供默认值,还能够与各种工厂函数和自定义函数结合使用,适应不同的数据处理需求。从简单的计数到复杂的嵌套字典,defaultdict
的灵活性和便利性使得它在许多应用场景中成为了不可或缺的工具。
希望这篇文章能帮助你更好地理解和使用 defaultdict
,并将其应用到实际项目中。
学习资料见知识星球。
以上就是今天要分享的技巧,你学会了吗?若有什么问题,欢迎在下方留言。
快来试试吧,小琥 my21ke007。获取 1000个免费 Excel模板福利!
更多技巧, www.excelbook.cn
欢迎 加入 零售创新 知识星球,知识星球主要以数据分析、报告分享、数据工具讨论为主;
1、价值上万元的专业的PPT报告模板。
2、专业案例分析和解读笔记。
3、实用的Excel、Word、PPT技巧。
4、VIP讨论群,共享资源。
5、优惠的会员商品。
6、一次付费只需99元,即可下载本站文章涉及的文件和软件。