查找字典键的交集并将其组合

时间:2018-12-05 17:27:30

标签: python list function dictionary intersection

所以我有问题。 我具有此功能,可以获取包含字典作为输入的列表,输出应是一个新字典,其中包含所有输入字典中的键,并作为一个值包含所有键具有的值的列表。

E.G。

d1 = {1: 10, 2: 20, 3: 30, 4: 40, 5: 50}

d2 = {1: 20, 3: 60, 5: 100}

d3 = {1: 10, 7: 70, 5: 55}

print find_intersection([d1, d2, d3])
# prints {1: [10, 10, 20], 5: [50, 55, 100]}

3 个答案:

答案 0 :(得分:2)

如果您首先找到keys()交集,则可以对字典进行理解。

您可以使用__and__在字典上进行reduce()(感谢UltraInstinct)来构建键的交集。

import operator
# python 3
# from functools import reduce

dicts = [
   {1: 10, 2: 20, 3: 30, 4: 40, 5: 50},
   {1: 20, 3: 60, 5: 100},
   {1: 10, 7: 70, 5: 55}
]

keys = reduce(operator.__and__, map(set, dicts)

{k: [d[k] for d in [d1, d2, d3]] for k in keys}

# {1: [10, 20, 10], 5: [50, 100, 55]}

答案 1 :(得分:0)

您可以在单个for循环中执行此操作。每个输入字典中都不存在的任何键都会引发KeyError

def find_intersection(dicts):
    retval = {}
    for key in dicts[0]:
        try:
            retval[key] = [d[key] for d in dicts]
        except KeyError:
            pass
    return retval

答案 2 :(得分:0)

您可以使用defaultdic,并将值附加到键上。之后,只需查找长度为3的值,就可以得到关键的交点。

from collections import defaultdict
d = defaultdict(list)
d1 = {1: 10, 2: 20, 3: 30, 4: 40, 5: 50}
d2 = {1: 20, 3: 60, 5: 100}
d3 = {1: 10, 7: 70, 5: 55}

for dic in [d1,d2,d3]:
    for k,v in dic.iteritems():
        d[k].append(v)

d个输出:

defaultdict(list,
    {1: [10, 20, 10],
     2: [20],
     3: [30, 60],
     4: [40],
     5: [50, 100, 55],
     7: [70]})
相关问题