如何将列表的两个默认词典合并为一个

时间:2012-08-04 18:18:52

标签: python

the d1 is  defaultdict(<type 'list'>, {'A': [4, 4, 4, 4], 'S': [1]})
the d2 is  defaultdict(<type 'list'>, {'A': [4, 4, 4], 'B': [2], '[]': [4, 4]})

如何将这两个词典合并为一个?

预期输出应为

the d3 is  defaultdict(<type 'list'>, {'A': [4], 'B': [2], 'S':[1] ,'[]': [4]})

在结果字典中,多个值应该组成一个

3 个答案:

答案 0 :(得分:2)

您应该使用set作为default_factory属性,因为集合不会保留重复的元素:

d1 = defaultdict(set)

要将现有defaultdict转换为使用sets,请尝试以下操作:

defaultdict(set, {key: set(value) for key, value in d1.iteritems()})

对于旧的Python版本:

defaultdict(set, dict((key, set(value)) for key, value in d1.iteritems()))

答案 1 :(得分:0)

尝试:

d1.update(d2)
for val in d1.values():
    if len(val) > 1:
        val[:] = [val[0]]

答案 2 :(得分:0)

以下是你所说的你想要的:

from collections import defaultdict

d1 = defaultdict(list, {'A': [4, 4, 4, 4], 'S': [1], 'C': [1, 2, 3, 4]})
print 'the d1 is ', d1
d2 = defaultdict(list, {'A': [4, 4, 4], 'B': [2], '[]': [4, 4], 'C': [1, 2, 3]})
print 'the d2 is ', d2

d3 = defaultdict(list, dict((key, set(value) if len(value) > 1 else value)
                                for key, value in d1.iteritems()))
d3.update((key, list(d3[key].union(set(value)) if key in d3 else value))
                                for key, value in d2.iteritems())
print
print 'the d3 is ', d3

输出:

the d1 is  defaultdict(<type 'list'>, {'A': [4, 4, 4, 4], 'S': [1], 'C': [1, 2, 3, 4]})
the d2 is  defaultdict(<type 'list'>, {'A': [4, 4, 4], 'C': [1, 2, 3], 'B': [2], '[]': [4, 4]})

the d3 is  defaultdict(<type 'list'>, {'A': [4], 'S': [1], 'B': [2], 'C': [1, 2, 3, 4], '[]': [4, 4]})

请注意,我向'C'd1添加了一个键入d2的列表,以显示您的问题中未提及的可能性 - 所以我不知道是否这是你想要发生的事情。