添加词典

时间:2016-01-16 21:07:12

标签: python function dictionary collections

我试图建立一个功能

def adding_3dict(d1,d2,d3)

该函数获得3个词典d1,d2,d3, 从他们创建一个词典D. 这样如果在d1,d2,d3的多个字典中找到一个键, 它在D中的值将是所有词典中所有值的元组。 来自d1,d2,d3的其余对被原样复制到D. 该函数返回新字典D.

示例:

d1={1:'a',3:'d',5:'e'}
d2={1:'b',3:(11,22),7:'f',4:'q'}
d3={2:'c',3:'x',4:'t',8:'g'}

输出字典是:

d =  {1: ('a', 'b'), 2: 'c', 3: ('d', (11, 22), 'x'), 4: ('q', 't'), 5: 'e', 7: 'f', 8: 'g'}

我试过了:

import collections

d1={}
d2={}
d3={}
def adding_3dict(d1,d2,d3):
    d={}
    d=dict(d1.items() + d2.items()+ d3.items() )

    return d

我试过了,我的输出是:

>>> 
>>> adding_3dict( {1:'a',3:'d',5:'e'}, {1:'b',3:(11,22),7:'f',4:'q'} , {2:'c',3:'x',4:'t',8:'g'} )
{1: 'b', 2: 'c', 3: 'x', 4: 't', 5: 'e', 7: 'f', 8: 'g'} #the output
>>> 

如何更改

的输出
{1: 'b', 2: 'c', 3: 'x', 4: 't', 5: 'e', 7: 'f', 8: 'g'}

{1: ('a', 'b'), 2: 'c', 3: ('d', (11, 22), 'x'), 4: ('q', 't'), 5: 'e', 7: 'f', 8: 'g'}

2 个答案:

答案 0 :(得分:0)

这是一个可以接受任意数量字典的解决方案:

from itertools import chain

def custom_dictmerge(*args):
    result = {}
    keys = set(chain(*(d.keys() for d in args)))
    for k in keys:
        result[k] = tuple(d[k] for d in args if k in d)
        if len(result[k]) == 1:
            result[k] = result[k][0]
    return result

致电custom_dictmerge(d1, d2, d3)

答案 1 :(得分:0)

使用defaultdict中的collections可以将所有值附加到列表中。所以你只需要解析每个字典的键。

from collections import defaultdict

def mergedict(list_of_dicts):
    d = defaultdict(list)
    for di in list_of_dicts:
        for k, v in di.items():
            d[k].append(v)
    return d

如果你真的需要元组和单个值,那么你总是可以将列表转换为你想要的任何类型。

def convert_to_tuples(d):
    """ converts values inplace """
    for k, v in d.items():
        if len(v) > 1:
            d[k] = tuple(v)
        else:
            d[k] = v[0]
    return d