首页 > 解决方案 > 如何在没有有序字典的字典中访问循环中的前一个键?

问题描述

我正在尝试迭代month_days几个月的键的字典,以year_month_cal在每个循环之后执行一些计算以存储在另一个字典中。我正在尝试编写通用代码,而不是每次都对键值进行硬编码。

month_day = {'JAN': 31, 'FEB': 28, 'MARCH': 31, 'APRIL': 30, 'MAY': 31, 'JUNE': 30, 'JULY': 31, 'AUG': 31,
             'SEPT': 30, 'OCT': 31, 'NOV': 30, 'DEC': 31}
year_cal_no = {}

for k, v in month_day.items():
    month_cal ={}
    if k in month_day.keys():
        V = month_day[k]

        if k in ['JAN']:
            for i in range(1, V + 1):
                cal_no = 40
                month_cal_no = cal_no * i

                print(i, month_cal_no )
                month_cal[k] = cal_no
                year_cal_no[k] = month_cal_no
        if k in ['FEB']:
            for i in range(1, V + 1):
                #Here I want to remove JAN and access the previous key as k-1 or something
                cal_no = month_cal['JAN']
                month_cal_no = cal_no * i
                print(i, month_cal_no)

            month_cal[k] = cal_no
            year_cal_no[k] = month_cal_no

print(year_cal_no)
print(month_cal)

输出是:

{'JAN': 1240, 'FEB': 1120}
{'JAN': 40, 'FEB': 40}

我需要帮助以使此逻辑更通用,而不是每次都对密钥进行硬编码。

标签: pythonpython-3.xlistloopsdictionary

解决方案


使用元组列表而不是字典。然后,当您遍历列表时,您可以访问上一个索引。

此外,您不应month_cal在每次迭代中重置字典,因为您会丢失上个月的信息。

cal_no您应该在循环之前分配for i,因为它不会在循环内改变。

month_day = [('JAN', 31), ('FEB', 28), 'MARCH': 31, 'APRIL': 30, ('MAY', 31), 'JUNE': 30, 'JULY': 31, ('AUG', 31),
             'SEPT': 30, ('OCT', 31), ('NOV', 30), ('DEC', 31)]
year_cal_no = {}
month_cal = {}

month, days = month_day[0]
cal_no = 40
for i in range(1, days+1):
    month_cal_no = cal_no * i
    print(i, month_cal_no)
    month_cal[month] = cal_no
    year_cal_no[month] = month_cal_no

for month_index, (month, days) in enumerate(month_day[1:]):
    cal_no = month_cal[month_day[month_index][0]]
    for i in range(1, days+1):
        month_cal_no = cal_no * i
        print(i, month_cal_no)
        month_cal[month] = cal_no
        year_cal_no[month] = month_cal_no

print(year_cal_no)
print(month_cal)

推荐阅读