美文网首页
python中defaultdict使用ChainMap合并字典

python中defaultdict使用ChainMap合并字典

作者: cced | 来源:发表于2020-01-31 11:36 被阅读0次

    最近在进行数据处理对字典进行合并,采用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

    相关文章

      网友评论

          本文标题:python中defaultdict使用ChainMap合并字典

          本文链接:https://www.haomeiwen.com/subject/dtlgthtx.html