python中defaultdict使用ChainMap合并字典查询失败的处理

最近在进行数据处理对字典进行合并,采用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']
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值