0
votes

Fusionner la liste des dictionnaires imbriqués

J'ai 3 listes comme ci-dessous, qui sont extraites à partir d'un fichier PDF, xxx

et j'ai converti ces listes dans une liste de dictionnaires comme ci-dessous XXX

Y a-t-il un moyen de itération sur cette liste pour fusionner les clés et les valeurs basées sur ADID. Tels que xxx

ou existe un meilleur moyen de fusionner de telles données?


1 commentaires

Oui, il y a plusieurs façons. Qu'avez-vous essayé et quel est le problème avec cela?


4 Réponses :


3
votes

en utilisant dict.setdefault et une simple itération. Vous pouvez également utiliser Collection.defaultDict

ex: xxx

sortie: xxx


2 commentaires

Très appréciée! Ça marche. Question rapide est, la méthode "mise à jour" peut-elle automatiquement résumer les valeurs avec les mêmes clés? Dites, et s'il existe deux ou trois "frais de média" avec le même ADID dans la liste d'origine. Est-ce que cela résumera automatiquement toutes les valeurs?


Non, ce ne sera pas. Vous aurez utiliser une logique supplémentaire ou une utilisation collection.Counter



1
votes

Vous pouvez essayer ceci.

{'9940542': {'Invalid Adjust(Platform Fee)': '-1.00',
  'Invalid Adjust(Media Fee)': '-2.00'},
 '10315065': {'Invalid Adjust(Platform Fee)': '-1.00',
  'Invalid Adjust(Media Fee)': '-3.00'},
 '11211744': {'Invalid Adjust(Platform Fee)': '-290.00',
  'Invalid Adjust(Media Fee)': '-3403.00'},
 '11309685': {'Invalid Adjust(Platform Fee)': '-57.00',
  'Invalid Adjust(Media Fee)': '-670.00'},
 '12103490': {'Media Fee': '709472.00',
  'Platform Fee': '22703.00',
  'Invalid Adjust(Platform Fee)': '-30.00',
  'TrueView Budget Adjust (Platofrm Fee)': '-301.00',
  'Invalid Adjust(Media Fee)': '-348.00',
  'TrueView Budget Adjust (Media Fee)': '-9376.00'},
 '12160150': {'Media Fee': '549173.00', 'Platform Fee': '17573.00'}}


0 commentaires

1
votes

Vous pouvez le faire avec 1 ligne de code utilisant python-benedict code>, c'est une sous-classe dict avec de nombreuses fonctionnalités et c'est Open-Source sur GitHub (je suis l'auteur).

Installation: PIP Installation Python-Benedict Code> P>

from benedict import benedict as bdict

data_input= [
    {'9940542': {'Invalid Adjust(Platform Fee)': '-1.00'}},
    {'9940542': {'Invalid Adjust(Media Fee)': '-2.00'}},
    {'10315065': {'Invalid Adjust(Platform Fee)': '-1.00'}},
    {'10315065': {'Invalid Adjust(Media Fee)': '-3.00'}},
    {'11211744': {'Invalid Adjust(Platform Fee)': '-290.00'}},
    {'11211744': {'Invalid Adjust(Media Fee)': '-3403.00'}},
    {'11309685': {'Invalid Adjust(Platform Fee)': '-57.00'}},
    {'11309685': {'Invalid Adjust(Media Fee)': '-670.00'}},
    {'12103490': {'Media Fee': '709472.00'}},
    {'12103490': {'Platform Fee': '22703.00'}},
    {'12103490': {'Invalid Adjust(Platform Fee)': '-30.00'}},
    {'12103490': {'TrueView Budget Adjust (Platofrm Fee)': '-301.00'}},
    {'12103490': {'Invalid Adjust(Media Fee)': '-348.00'}},
    {'12103490': {'TrueView Budget Adjust (Media Fee)': '-9376.00'}},
    {'12160150': {'Media Fee': '549173.00'}},
    {'12160150': {'Platform Fee': '17573.00'}}
]

data_output = bdict()
data_output.merge(*data_input)
print(data_output.dump())


0 commentaires

0
votes

Pour l'enregistrement, une doublure. Ne pas utiliser dans le code de production (utilisez setingdefault code> comme dans @rakesh Réponse) strong>.

>>> {k1: {u: v for (k2, u, v) in zip(adID, description, spendItem) if k2 == k1} for k1 in set(adID)}
{'9940542': {'Invalid Adjust(Platform Fee)': '-1.00', 'Invalid Adjust(Media Fee)': '-2.00'}, '12103490': {'Media Fee': '709472.00', 'Platform Fee': '22703.00', 'Invalid Adjust(Platform Fee)': '-30.00', 'TrueView Budget Adjust (Platofrm Fee)': '-301.00', 'Invalid Adjust(Media Fee)': '-348.00', 'TrueView Budget Adjust (Media Fee)': '-9376.00'}, '12160150': {'Media Fee': '549173.00', 'Platform Fee': '17573.00'}, '10315065': {'Invalid Adjust(Platform Fee)': '-1.00', 'Invalid Adjust(Media Fee)': '-3.00'}, '11309685': {'Invalid Adjust(Platform Fee)': '-57.00', 'Invalid Adjust(Media Fee)': '-670.00'}, '11211744': {'Invalid Adjust(Platform Fee)': '-290.00', 'Invalid Adjust(Media Fee)': '-3403.00'}}


0 commentaires