您的位置:

Python中的defaultdict用法详解

引言

作为一种高级编程语言,Python在许多方面都非常方便和易用,其强大的数据结构和函数库尤其让广大程序员爱不释手。其中,defaultdict是Python内置的一个特殊字典,可以在定义时为字典提供一个默认值,让程序更为简洁和高效。本文将对Python中的defaultdict进行详细讲解,希望能够帮助读者更好地使用Python。

正文

一、defaultdict的基本用法

Python中的defaultdict是一个正常的字典(dict)类型,与字典唯一的区别在于,当访问一个不存在的键(key)时,defaultdict会自动创建这个键,并将其对应的值设置为一个默认值。这可以在一些情况下,特别是在处理dict重复键的情况下,非常有用。

defaultdict对象的定义方式和字典(dict)是类似的,只需要使用collections库中的defaultdict类,并在实例化时传递一个函数作为默认值即可,具体用法如下:

    from collections import defaultdict

    d = defaultdict(int)
    d['a'] += 1
    d['b'] += 1

    print(d) # defaultdict(, {'a': 1, 'b': 1})

  

可以看到,这里我们定义了一个defaultdict对象d,并将其默认值设置为int类型,然后我们向d中加入了两个键值对,并分别为键'a'和键'b'赋值1。最后打印输出d的值,可以看到d中的键'a'对应的值为1,键'b'对应的值也为1。

这个例子中最关键的部分是defaultdict的定义方式d = defaultdict(int),其中函数int()作为了默认值。这将会使得在以后访问不存在的键时,defaultdict都会将其对应的值默认设置为0。

二、使用自定义函数设置defaultdict的默认值

在前面的例子中,我们已经了解了如何使用默认值int()来创建defaultdict对象。实际上,在Python中,我们可以使用任何可以在字典中用作值的函数作为defaultdict的默认值。这意味着我们可以定义一个自定义的函数作为默认值,从而使defaultdict更加灵活。

例如,我们定义一个函数findMyName,该函数在默认情况下返回字符串“unknown”,在这个函数的基础上,我们就可以创建一个默认值为“unknown”的defaultdict对象,如下所示:

    def findMyName():
        return 'unknown'

    favorite_colors = defaultdict(findMyName)
    print(favorite_colors['Tom']) # unknown
    print(favorite_colors['Jerry']) # unknown

这里我们定义了函数findMyName,该函数返回一个默认的字符串“unknown”。然后我们定义了一个defaultdict对象favorite_colors,并将其默认值设置为findMyName函数,并使用该defaultdict对象分别访问了Tom和Jerry两个键,可以看到输出的结果都是字符串“unknown”。

三、使用lambda函数作为defaultdict的默认值

除了直接定义一个函数之外,我们还可以使用Python中的lambda函数来设置defaultdict的默认值。Lambda函数可以在Python中非常方便地定义一些小型的匿名函数。

以一个简单的计数器为例,我们可以使用lambda函数来定义一个匿名函数:

    from collections import defaultdict

    counter = defaultdict(lambda: 0)
    counter['a'] += 1
    counter['b'] += 2
    counter['c'] += 3

    print(counter) # defaultdict(
    at 0x0000027D4D07C940>, {'a': 1, 'b': 2, 'c': 3})

   
  

这里我们定义了一个名为counter的defaultdict对象,并使用lambda函数来设置其默认值。当我们向counter中加入键值对时,如果该键不存在,defaultdict就会自行调用lambda函数,并将其返回的值作为该键的默认值来创建一个空字典。

四、结合set和list的defaultdict

除了字典类型的defaultdict之外,我们还可以使用defaultdict来构建set和list类型的对象。这在一些需要去重或者统计元素出现次数等需求时非常实用。

以一个简单的统计单词出现次数的例子来说明:假设我们有一个字符串,我们要统计其中每个单词出现的次数。我们可以使用defaultdict来统计,代码如下:

    from collections import defaultdict

    sentence = 'this is a test of defaultdict'
    word_count = defaultdict(int)

    # 利用split方法分割字符串,生成单词列表
    for word in sentence.split():
        word_count[word] += 1

    print(word_count) # defaultdict(, {'this': 1, 'is': 1, 'a': 1, 'test': 1, 'of': 1, 'defaultdict': 1})

  

在这个例子中,我们定义了一个defaultdict对象word_count,并将其默认值设置为0。然后我们将字符串sentence按单词分割,并遍历每个单词,使用defaultdict统计每个单词出现的次数。

需要注意的是,在使用defaultdict统计时,我们只需要在遍历每个单词时,直接对word_count中的对应单词计数器+1即可。不需要再次判断键是否存在,defaultdict会自动帮助我们完成所有操作。

除了可以用于统计单词出现次数之外,defaultdict还可以用于构建set和list类型的对象。例如,我们可以使用defaultdict来构建一个包含同一元素多次出现的列表:

    from collections import defaultdict

    word_list = ['apple', 'banana', 'apple', 'pear', 'banana', 'orange']
    word_count = defaultdict(list)

    for word in word_list:
        word_count[word].append(word)

    print(dict(word_count)) # {'apple': ['apple', 'apple'], 'banana': ['banana', 'banana'], 'pear': ['pear'], 'orange': ['orange']}

在这个例子中,我们定义了一个列表类型的defaultdict对象word_count,并对word_list列表中的每个元素使用append方法添加到word_count中对应的键值列表中。最终输出的结果是一个字典,其中每个键都对应一个列表,列表包含了同一元素的多次出现。

小结

本文主要对Python中的defaultdict进行了详细讲解,包括了defaultdict的基本用法、使用自定义函数设置defaultdict的默认值、使用lambda函数作为defaultdict的默认值、以及结合set和list的defaultdict。

使用defaultdict可以帮助我们更加方便地处理Python中的字典类型数据,并使代码更加整洁和高效。希望本文能够对读者有所帮助。