python 使用 defaultdict

先思考这样一个场景:

1. 交警查到有人违章,根据这个人的车牌号去扣分 [ 每个人初始都有12分 ]。

那么在实现扣分的时候,我们就需要查询这个人有没有初始值,没有的话需要为其赋初始值。

driver_points = {}

def deduct_points(name, points):
    if driver_points.get(name, None) is None:
        driver_points[name] = 12

    driver_points[name] -= points  # 扣分
    print(name, '剩余驾照分:', driver_points[name])


if __name__ == '__main__':
    deduct_points('eeert', 1)
2.再考虑一个场景,我们进行字数统计
word_count = {}

def count(words):
    for word in words:
        if word_count.get(word, None) is None:
            word_count[word] = 0

        word_count[word] += 1
    print(word_count)


if __name__ == '__main__':
    words = ['e', 'e', 'e', 'r', 't']
    count(words)

在这些场景中,我们每次执行都需要对数据初始值不存在的情况下进行判断。如果我们要统计一本有50万个词的书进行统计,那么就要执行50万次判断。
有没有好一点的办法呢?


defaultdictPython提供的一种高效数据结构,我们可以在创建时为其提供一个初始值。

from collections import defaultdict


def default_value():
    return 0


def count(words):
    word_count = defaultdict(default_value)

    for word in words:
        word_count[word] += 1
    print(word_count)  # defaultdict(, {'e': 3, 'r': 1, 't': 1})


if __name__ == '__main__':
    words = ['e', 'e', 'e', 'r', 't']
    count(words)

这样的话效率就高多了,而且开起来代码更明了一些。

defaultdict接收一个参数,我们可以传入int,list,dict,float等,也可以传入一个可调用的callback对象。

你可能感兴趣的:(python 使用 defaultdict)