Python 当多个字典的键具有值列表时,合并多个字典

Python 当多个字典的键具有值列表时,合并多个字典,python,dictionary,Python,Dictionary,我遇到了一篇文章,它有一个完整而正确的方法来合并两个字典,每个字典都有一个值列表 程序的输入如下: d1: {'apple': ['5', '65'], 'blue': ['9', '10', '15', '43'], 'candle': ['15'], 'is': ['5', '6', '13', '45', '96'], 'yes': ['1', '2', '3', '11'], 'zone': ['5', '6', '9', '10', '12', '14', '18', '19', '

我遇到了一篇文章,它有一个完整而正确的方法来合并两个字典,每个字典都有一个值列表

程序的输入如下:

d1:  {'apple': ['5', '65'], 'blue': ['9', '10', '15', '43'], 'candle': ['15'], 'is': ['5', '6', '13', '45', '96'], 'yes': ['1', '2', '3', '11'], 'zone': ['5', '6', '9', '10', '12', '14', '18', '19', '23', '24', '25', '29', '45']}
d2:  {'apple': ['43', '47'], 'appricote': ['1', '2', '3', '4', '5', '6'], 'candle': ['1', '2', '4', '5', '6', '9'], 'delta': ['14', '43', '47'], 'dragon': ['23', '24', '25', '26'], 'eclipse': ['11', '13', '15', '19'], 'island': ['1', '34', '35']}
合并功能的代码为:

def merge_dictionaries(dict1, dict2):

result = {}
new_result = {}
for key in set().union(*(dict1, dict2)):
    result[key] = sorted(dict1.get(key, []) + dict2.get(key, []), key=int)
    # Delete any double value for each key
    new_result[key] = [ii for n, ii in enumerate(result[key]) if ii not in result[key][:n]]

return new_result
结果:

Merged:  {'is': ['5', '6', '13', '45', '96'], 'dragon': ['23', '24', '25', '26'], 'apple': ['5', '43', '47', '65'], 'appricote': ['1', '2', '3', '4', '5', '6'], 'delta': ['14', '43', '47'], 'eclipse': ['11', '13', '15', '19'], 'yes': ['1', '2', '3', '11'], 'zone': ['5', '6', '9', '10', '12', '14', '18', '19', '23', '24', '25', '29', '45'], 'blue': ['9', '10', '15', '43'], 'island': ['1', '34', '35'], 'candle': ['1', '2', '4', '5', '6', '9', '15']}
我现在想要实现的是扩展这种方式来合并动态数量的这类词典。这是我的尝试,每次我从“dicts”列表中获取2个条目,并尝试合并它们

def merge_multiple_dictionaries(dicts):
''' This is just to print the input I get
l = len(dicts)
print("Len of dicts: ", l)
for j in range(0, l):
    print("j is: ", dicts[j])
'''
result = {}
new_result = {}
for k in range(0, l):
     if k is (len(dicts)-1):
        break
    print("k: ", k)
    for key in set().union(*(dicts[k], dicts[k+1])):
        result[key] = sorted(dicts[k].get(key, []) + dicts[k+1].get(key, []), key=int)
        # Delete any double value for each key
        new_result[key] = [ii for n, ii in enumerate(result[key]) if ii not in result[key][:n]]
# result = OrderedDict(sorted([(k, v) for k, v in result.items()]))

return new_result

那么有没有更类似Python的方法来实现这一点呢?

您有一个输入错误:您使用了
dict
,您的意思是
dicts

不需要像set()那样迭代成对的字典。union()操作可以使用多个参数:

def merge_dictionaries(*args):
    result = {}
    for key in set().union(*args):
        # let's convert the value union to set before sorting to get rid of the duplicates
        result[key] = sorted(set.union(*[set(d.get(key, [])) for d in args]), key=int)
    return result

你不觉得这应该只是一个评论吗?这个问题是由一个简单的打字错误引起的,这使它脱离了主题。回答这样的问题会给新用户发送错误的信息,告诉他们什么是关于SO的主题。谢谢,我编辑了打字错误。这个问题仍然存在,因为它工作得很好。。。谢谢,有好的文档吗?因为从我发现的到现在它有点复杂。通常help()应该可以工作,例如
help(set.union)