Python, как объединить три словаря в одну фильтрацию по ключу? - PullRequest
0 голосов
/ 14 июля 2020

У меня есть следующие словари:

personale_dip={'a': [550.0], 'b': [157.65]}
personale_dip_costo={'a': [1.0], 'b': [150.0]}
personale_result={'a': 550.0, 'b': 23648.64}

Personale_result получено со следующим кодом:

personale_result={k : v[0] * personale_dip_costo[k][0] for k, v in personale_dip.items() if k in personale_dip_costo}

Я хочу создать новую переменную с именем final_value это, что для каждого ключа (сопоставления их по словарю) суммируются все три словаря, давая мне следующий результат:

final_value={'a': [550.0, 1.0, 550.0],   'b': [157.65, 150.0, 23648.64]}

Как мне это сделать? Любая помощь приветствуется. Заранее спасибо!

EDIT

Я пробовал следующий код:

from collections import defaultdict

personale_dip = {'a': [550.0], 'b': [157.65]}
personale_dip_costo = {'a': [1.0], 'b': [150.0]}
personale_result = {'a': 550.0, 'b': 23648.64}

data = defaultdict(list)

for d in [personale_dip, personale_dip_costo, personale_result]:
    for k, v in d.items():
        if isinstance(v, list):
            data[k].extend(v)
        else:
            data[k].append(v)

, но результат

defaultdict(<class 'list'>, {'a': [550.0, 1.0, 550.0], 'b': [157.65, 150.0, 23648.64]}) 

Если я хочу получить только

{'a': [550.0, 1.0, 550.0], 'b': [157.65, 150.0, 23648.64]}

Как мне его получить?

Ответы [ 3 ]

2 голосов
/ 14 июля 2020

Ну ты где на правильном пути. Лично я бы просто слил их:

final_value = {}
for key in personale_result:
    final_value[key] = (personale_dip[key][0], personale_dip_costo[key][0], personal_result[key])

С вашим вводом это даст вам:

>>> final_result
{'a': [550.0, 1.0, 550.0], 'b': [157.65, 150.0, 23647.5]}

Теперь personale_dip и personale_dip_costo имеют тип {string, list}. В настоящее время ваш personale_result будет просто игнорировать другие значения в этом списке, как и final_result.

1 голос
/ 14 июля 2020

ОТВЕТ 2.0

personale_dip={'a': [550.0], 'b': [157.65]}
personale_dip_costo={'a': [1.0], 'b': [150.0]}
personale_result={'a': 550.0, 'b': 23648.64}

final_value = {}

for dictionary in [personale_dip, personale_dip_costo, personale_result]:
    for k,v in dictionary.items():
        # if the key is there, then 
        # check whether it a list or a normal string
        # if list add it like [] + []
        # if not then add it like [] + [v]
        if k in final_value:
            if isinstance(v, type([])): final_value[k] += v
            else: final_value[k] += [v]
        else:
            if isinstance(v, type([])): final_value[k] = v
            else: final_value[k] = [v]
print(final_value)

ВЫХОД

>>> {'a': [550.0, 1.0, 550.0], 'b': [157.65, 150.0, 23648.64]}

Это отредактировано и дает вам то, что вы хотите.

0 голосов
/ 14 июля 2020
personale_dip = {'a': [550.0], 'b': [157.65]}
personale_dip_costo = {'a': [1.0], 'b': [150.0]}
personale_result = dict()
for key_pd in personale_dip:
    if key_pd in personale_dip_costo.keys():
        personale_result[key_pd] = [personale_dip[key_pd][0], personale_dip_costo[key_pd][0], personale_dip[key_pd][0]*personale_dip_costo[key_pd][0]]

Этот код должен работать, учитывая, что список внутри dict содержит только 1 элемент. Это будет работать, даже если в personale_dip больше элементов, или наоборот.

...