0
votes

Python, comment fusionner trois dictionnaires en un seul filtrage pour la clé?

J'ai les dictionnaires suivants:

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

Personale_result a été obtenu avec le code suivant:

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

Je souhaite créer une nouvelle variable, appelée valeur_finale qui, pour chaque clé (en les faisant correspondre dans le dictionnaire), résume les trois dictionnaires en me donnant le résultat suivant:

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)


2 commentaires

what_you_want = dict (data.items ()) ? Un defaultdict est juste un dict avec du sucre en haut ... pourquoi ne pas garder le defaultdict?


Hé, j'ai édité ma réponse, pouvez-vous vérifier si cela vous est utile :)


3 Réponses :


1
votes

RÉPONSE 2.0

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

SORTIE

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)

Ceci est modifié, et vous donne ce que vous voulez.


0 commentaires

2
votes

Eh bien, vous étiez sur la bonne voie. Personnellement, je les fusionnerais simplement:

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

Avec votre entrée, cela vous donnera:

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

Désormais, personale_dip et personale_dip_costo sont de type {string , liste}. Actuellement, votre personale_result ignorera simplement les autres valeurs de cette liste, de même que final_result.


0 commentaires

0
votes
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]]
This code should work considering the list inside the dict contains only 1 element. This will work even if personale_dip has more elements or vice versa.

0 commentaires