Найти пересечения словарных ключей и объединить их - PullRequest
0 голосов
/ 05 декабря 2018

Итак, у меня проблема.У меня есть эта функция, где я получаю список, содержащий словари в качестве входных данных, и вывод должен представлять собой новый словарь с ключами, которые все находятся во входных словарях, а в качестве значения - список, который содержит все значения, которые имели ключи.

EG

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 голосов
/ 05 декабря 2018

Если вы сначала найдете пересечение keys(), вы можете создать словарь с пониманием.

Вы можете уменьшить () (благодаря UltraInstinct) над словарями с помощью __and__, чтобы построить пересечениеключи.

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]}
0 голосов
/ 05 декабря 2018

Вы можете использовать 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]})
0 голосов
/ 05 декабря 2018

Вы можете сделать это за один цикл 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
...