嵌套字典循环

3

我是编程新手。我试图弄清楚如何使用嵌套的for循环从“budgeted”中减去“actual”,然后将该值更新为“variance”。但是,我读到过在迭代时修改字典不是最佳实践。到目前为止,我对如何继续进行感到困惑。

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}, ............

你可以在迭代过程中更新字典中的值,但不应该删除或插入新的值。 - Sri
5个回答

2

只需遍历字典并检查内部字典是否存在实际方差预算,如果存在,则修改方差值。

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']

1

在迭代时修改字典内部的值并没有问题。唯一不建议的是修改字典本身,即添加/删除元素。


1
尝试类似以下的内容:
for i in properties:
    properties[i]['variance'] = properties[i]['budgeted'] - properties[i]['actual']

如果你不确定字典中是否存在“budgeted”和“actual”,你应该捕获KeyError并适当处理:
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

你能否使用 dict.get() 代替 try 块呢? - bherbruck
有人认为更符合Python风格的做法是先尝试,然后再在出错时进行处理。https://dev59.com/gGct5IYBdhLWcg3wNqwg#12265860 - Dallan
但是,如果假设不存在variance或者不需要variance,使用try和except会增加太多时间,而且还会创建一个新的键variance,这并不是必要的。因此,使用if x in dic.keys()是更好的选择。 - sahasrara62

1
你的数据格式很奇特,我通常尝试将相似的对象分组到字典中,而不是在同一级别的字典中同时具有元数据和“列表”项。但是这也适用于你的情况:
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))

输出:

{
    "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
    }
}

0
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)

我不太明白具体意思,但这应该可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接