python字典dict处理缺失值的若干方法


例一

给一家三明治店设计菜单,先确定大家喜欢吃哪些类型的面包。于是,我们定义这样一个字典,把每种款式的名字和它当前的得票数关联起来。

counters = {
    'pumpernicker': 2,
    'sourdough': 1
}

如果要记录新的一票,首先判断对应的键在不在字典中。如果不在就要把这个键添加到字典中,把票数默认置零,然后加上相应的票数。

方法一

使用 in 表达式判断给定的键是否在字典中。

key = 'wheat'
if key in counters:
    counters[key] += 1
else:
    counters[key] = 1

方法二

利用KeyError异常

try:
    counter[key] += 1
except KeyError:
    counter[key] = 1

两种方法的缺点:需要两次访问字典,当字典元素规模很大时,操作是费时的

方法三

Python内置的字典dict类型提供了get方法,可以通过第一个参数指定要查找的键,并通过第二个参数指定这个键不存在时应返回的默认值。这种方法只需要在查询键值时访问一次键名,然后做一次赋值操作

count = counters.get(key, 0)
counters[key] = count + 1

例二

如果字典里保存的值比较复杂,例如列表list。对例一的问题进一步扩展,这次不仅要记录每种面包的得票数,还要记录投票的人,我们只需对字典做如下改写:

votes = {
    'baguette': ['Bob', 'Alice'],
    'ciabatta': ['Coco', 'Deb']
}

key = 'brioche'
who = 'Elmer'

if key in votes:
    votes[key].append(who)
else:
    votes[key] = [who]

类似,我们也可以用KeyError机制来改写。

try:
    votes[key].append(who)
except KeyError:
    votes[key] = [who]

使用get方法

names = votes[key]
if names is None:
    votes[key] = names = []
names.append(who)

dict提供了setdefault方法,这个方法会查询字典里有没有这个键,如果有,就返回对应的值,如果没有,就先把用户提供的默认值跟这个键关联起来并插入字典,然后返回这个值。

names = votes.setdefault(key, [])
names.append(who)

defaultdict

defaultdict是Python内建dict类的一个子类,第一个参数为default_factory属性提供初始值,默认为None。它覆盖一个方法并添加一个可写实例变量。它的其他功能与dict相同,但会为一个不存在的键提供默认值,从而避免KeyError异常。

如何使用defaultdict[1]

首先导入相应模块:from collections import defaultdict。
defaultdict接受一个工厂函数作为参数,如下来构造:

my_dict = defaultdict(factory_function)

这个factory_function可以是list、set、str等等,作用是当key不存在时,返回的是工厂函数的默认值,比如list对应[ ],str对应的是空字符串,set对应set( ),int对应0,如下举例:
例一

from collections import defaultdict

dict1 = defaultdict(int)
dict2 = defaultdict(set)
dict3 = defaultdict(str)
dict4 = defaultdict(list)
dict1[2] ='two'

print(dict1[1])
print(dict2[1])
print(dict3[1])
print(dict4[1])

输出:

0
set()

[]

例二

from collections import defaultdict

s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
d = defaultdict(set)
for k, v in s:
  d[k].add(v)

print(d)

输出:

defaultdict(<class 'set'>, {'red': {1, 3}, 'blue': {2, 4}})

参考


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM