python中defaultdict使用ChainMap合并字典

2020-01-31  本文已影响0人  cced

最近在进行数据处理对字典进行合并,采用ChainMap方法,在查询时出现了一个问题,查询结果为空,排查子字典,该键值对是存在的,通过反复核对测试发现这个问题是defaultdict引起的。

1. defaultdict使用ChainMap合并字典查询失败问题

问题如下:

#!/usr/bin/python3
# -*- coding:UTF-8 -*-
from collections import defaultdict,ChainMap
>>> len(dict218)  #dict218为一组数据字典
952
>>> len(dict318)  #dict318为一组数据字典
970
>>> len(dict418)  #dict418为一组数据字典
930
>>> dictall=ChainMap(dict218,dict318,dict418)
>>> len(dictall)   
2850        #dict218,dict318,dict418含有重复项,合并减少2个,所以总数少2个,字典总长度和实际一致,需要查询的键也在ChainMap后的字典中
>>> '04004622'in dict218
False
>>> '04004622'in dict318
False
>>> '04004622'in dict418
True
>>> '04004622'in dictall
True

但在查询时会出现查询不到而返回默认的空list,而且在dict218中会默认添加一个键为'04004622'值为[]的键值对

>>> dictall.get('04004622')
[]
>>> '04004622'in dict218
True

这个问题是有defaultdict本身决定的:defaultdict类的初始化函数接受一个类型作为参数,当所访问的键不存在的时候,可以实例化一个值作为默认值,因此此处当数据量偏大时(小数据量未发现此问题),未在第一个dict中访问到时,会默认在第一个dict临时添加一个空值的键值对,并返回空值,导致查询失败。

2. 处理方法

将defaultdict转化为普通的dict再使用ChainMap,问题得到解决。

>>> dictall=ChainMap(dict(dict218),dict(dict318),dict(dict418))
>>> '04004622'in dictall
True
>>> dictall.get('04004622')
['全长m,0到4238']

同步发于CSDN:https://blog.csdn.net/cced1934/article/details/104122217

上一篇下一篇

猜你喜欢

热点阅读