Сумма кортежей декартовых произведений произвольного числа диктов - PullRequest
0 голосов
/ 17 ноября 2018

Я хотел бы сделать декартово произведение нескольких диктов на основе их ключей, а затем сложить произведенные кортежи и вернуть их как диктат.Ключи, которые не существуют в одном диктовке, следует игнорировать (это ограничение идеально, но не обязательно; т. Е. Вы можете предположить, что все ключи существуют во всех диктовках, если это необходимо).Ниже в основном то, что я пытаюсь достичь (пример показан с двумя диктовками).Есть ли более простой способ сделать это с N dicts?

def doProdSum(inp1, inp2):
    prod = defaultdict(lambda: 0)
    for key in set(list(inp1.keys())+list(inp2.keys())):
        if key not in prod:
            prod[key] = []
        if key not in inp1 or key not in inp2:
            prod[key] = inp1[key] if key in inp1 else inp2[key]
            continue
        for values in itertools.product(inp1[key], inp2[key]):
            prod[key].append(values[0] + values[1])
    return prod

x = doProdSum({"a":[0,1,2],"b":[10],"c":[1,2,3,4]}, {"a":[1,1,1],"b":[1,2,3,4,5]})
print(x)

Вывод (как и ожидалось):

{'c': [1, 2, 3,4], «b»: [11, 12, 13, 14, 15], «a»: [1, 1, 1, 2, 2, 2, 3, 3, 3]}

1 Ответ

0 голосов
/ 17 ноября 2018

Вы можете сделать это следующим образом, сначала реорганизовав свои данные по ключу:

from collections import defaultdict
from itertools import product


def doProdSum(list_of_dicts):
    # We reorganize the data by key
    lists_by_key = defaultdict(list)
    for d in list_of_dicts:
        for k, v in d.items():
            lists_by_key[k].append(v)

    # list_by_key looks like {'a': [[0, 1, 2], [1, 1, 1]], 'b': [[10], [1, 2, 3, 4, 5]],'c': [[1, 2, 3, 4]]}

    # Then we generate the output
    out = {}
    for key, lists in lists_by_key.items():
        out[key] = [sum(prod) for prod in product(*lists)]

    return out

Пример вывода:

list_of_dicts = [{"a":[0,1,2],"b":[10],"c":[1,2,3,4]}, {"a":[1,1,1],"b":[1,2,3,4,5]}]
doProdSum(list_of_dicts)

# {'a': [1, 1, 1, 2, 2, 2, 3, 3, 3],
#  'b': [11, 12, 13, 14, 15],
#  'c': [1, 2, 3, 4]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...