3 votes

Boucle de dictionnaire imbriquée

Je suis nouveau dans la programmation. J'essaie de comprendre comment soustraire "budgétisé" de "réel" et ensuite mettre à jour la valeur de "variance" en utilisant une boucle for imbriquée. Cependant, j'ai lu que ce n'était pas la meilleure pratique de modifier un dictionnaire pendant l'itération. Jusqu'à présent, je n'ai pas su comment procéder.

for i in properties:
    for j in properties[i]:
        if j == "actual":
            sum = properties[i][j]
            print('\nActual:' , sum)
        if j == "budgeted":
            sum_two = properties[i][j]
            print('Budgeted:' , sum_two)
            diff = sum_two - sum
            print('Variance:', diff)    

default_value = 0

properties = {587: {'prop_name': 'Collington'}, 'rental_income': {'apartment_rent': '5120-0000', 'resident_assistance': '5121-0000', 'gain_loss': '5120-0000'}, 51200000: {'actual': 29620, 'budgeted': 30509, 'variance': default_value}, 51210000: {'actual': 25620, 'budgeted': 40509, 'variance': default_value}, ............

2voto

prashant rana Points 2648

Il suffit d'itérer dans le dictionnaire et de vérifier si dans le dictionnaire interne, si actual , variance y budgeted existe ou non, si oui, modifiez le variance valeur

for k, v in properties.items():
    if (('actual' in v.keys()) and ('variance' in v.keys()) and ('budgeted' in v.keys())):
            properties[k]['variance'] = properties[k]['actual']-properties[k]['budgeted']

1voto

nightcracker Points 34498

Il n'y a rien de mal à modifier les valeurs à l'intérieur de un dictionnaire pendant l'itération. La seule chose qui n'est pas recommandée est la modification de l'élément le dictionnaire lui-même c'est-à-dire l'ajout ou la suppression d'éléments.

1voto

Dallan Points 449

Essayez quelque chose comme :

for i in properties:
    properties[i]['variance'] = properties[i]['budgeted'] - properties[i]['actual']

Si vous n'êtes pas sûr que bugeted y actual existent dans les dictionnaires, vous devez attraper le KeyError et le traiter de manière appropriée :

for i in properties:
    try:
        properties[i]['variance'] = properties[i]['budgeted'] - properties[i]['actual']
    except KeyError:
        properties[i]['variance'] = -1 # Set to some special value or just pass

1voto

bherbruck Points 1821

Vos données sont dans un format étrange, j'essaie toujours de regrouper les objets similaires dans des dictionnaires plutôt que d'avoir des métadonnées et des "listes" d'éléments dans le même niveau d'un dictionnaire. Mais cela peut fonctionner pour vous :

for prop in properties:
    p = properties[prop]
    if 'actual' or 'budgeted' in p.keys():
        # get() wont error if not found, also default to 0 if not found
        p['variance'] = p.get('budgeted', 0) - p.get('actual', 0)

import json
print(json.dumps(properties, indent=4))

Sortie :

{
    "587": {
        "prop_name": "Collington"
    },
    "rental_income": {
        "apartment_rent": "5120-0000",
        "resident_assistance": "5121-0000",
        "gain_loss": "5120-0000"
    },
    "51200000": {
        "actual": 29620,
        "budgeted": 30509,
        "variance": 889
    },
    "51210000": {
        "actual": 25620,
        "budgeted": 40509,
        "variance": 14889
    }
}

0voto

Ahmad Ali Points 50
sum = None
sum_two = None
for i in properties:
        for j in i:
            if j=="actual":
                sum = properties [i]["actual"] 
                print('\nActual:' , sum)
            if j == "budgeted":
                sum_two = properties[i]["budgeted"]
                print('Budgeted:' , sum_two)
                diff = sum_two - sum
                print('Variance:', diff)

Je n'ai pas compris ce que ça voulait dire exactement, mais ça devrait marcher.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X