【问题标题】:Comparing/combining two dictionaries比较/组合两个字典
【发布时间】:2012-05-10 09:42:07
【问题描述】:

我有两个带有键值对的字典,如下所示:

dict-1  ch:23, 100
        ch:24, 95

dict-2  Ch:23, 98
        ch:25, 100

并非所有键都出现在两个字典中,每个字典包含大约 200,000 个键值对。我想要做的是比较或组合这两者并生成一个输出文本文件,这样如果键在两个字典中,我都会得到两个值,输出文件格式如下:

ch:23   100   98         
ch:24   95    .    
Ch:25   .     100

我该怎么做?

【问题讨论】:

    标签: python dictionary python-2.7


    【解决方案1】:

    注意如果您使用的是字典(除非 OrderedDict),则不会保留顺序,因此您的结果的最终顺序将与您在示例中描述的不同

    回到你的例子 如果

    >>> d1={'ch:23': 100, 'ch:24': 95}
    >>> d2={'ch:23': 98 ,'ch:25': 100}
    

    你可以试试这个

    >>> d3=collections.defaultdict(list)
    >>> for k,e in d1.items()+d2.items():
        d3[k].append(e)
    

    如果要保留顺序,首先需要将原始字典创建为有序字典

    那么你可以这样做

    >>> d1
    OrderedDict([('ch:23', 100), ('ch:24', 95)])
    >>> d2
    OrderedDict([('ch:23', 98), ('ch:25', 100)])
    >>> d3=collections.OrderedDict()
    >>> for k,e in d1.items()+d2.items():
        d3.setdefault(k,[]).append(e)   
    >>> d3
    OrderedDict([('ch:23', [100, 98]), ('ch:24', [95]), ('ch:25', [100])])
    >>> 
    

    【讨论】:

    • 感谢您的 OrderedDict。我需要使用它,在安装 python 2.7.x 之后,它似乎解决了我的问题。但是,当两个 dict 之间的共享键的值相同时,原始值被覆盖,因此在输出中它似乎只有一个值。
    • 我想我在一位程序员朋友的帮助下解决了这个问题。制作 OrderedDict 后:
    • 朋友帮忙解决了这个问题:在制作 OrderedDict 后:merged_keys=d1_keys + d2_keys merge_keys = uniq(merged_keys) print mapped_keys print len(merged_keys) d3=collections.OrderedDict() output_doc = open("combo.txt ","w+") 用于合并键中的 ch_pos:line_output = ch_pos if (d1.has_key(ch_pos)): line_output = line_output + "\t" + d1[ch_pos] else: line_output = line_output + "\t" + "ND " if (d2.has_key(ch_pos)): line_output = line_output + "\t" + d2[ch_pos] else: line_output = line_output + "\t" + "ND" output_doc.write(line_output + "\n")
    • 1. OrderedDict 不像字典那样支持 + 或 += 运算符,您可以使用 update() 方法来克服这个问题。 2. OrderedDict 不允许您插入项目,只能追加,如果您专注于订单,可能需要这样做。这可以通过创建一个新的 OrderedDict 并在您想要的位置插入项目来克服,这很昂贵。作为替代方案,您可以覆盖 OrderedDict 并添加一个 insert() 方法。 3. 我决定只使用列表。在使用 OrderedDict 覆盖使代码膨胀后,我认为不值得不可读的代码带来好处。
    猜你喜欢
    • 1970-01-01
    • 2017-08-21
    • 2016-10-22
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    相关资源
    最近更新 更多