先思考这样一个场景:
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万
次判断。
有没有好一点的办法呢?
defaultdict
是Python
提供的一种高效数据结构,我们可以在创建时为其提供一个初始值。
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(<function default_value at 0x1100362f0>, {'e': 3, 'r': 1, 't': 1})
if __name__ == '__main__':
words = ['e', 'e', 'e', 'r', 't']
count(words)
这样的话效率就高多了,而且开起来代码更明了一些。
defaultdict
接收一个参数,我们可以传入int
,list
,dict
,float
等,也可以传入一个可调用的callback
对象。
网友评论