迭代字典 - Python

时间:2015-02-08 00:21:09

标签: python list python-2.7 dictionary

我的词典列表出了问题。 有一个保存列表的功能(如购物清单)。当用户创建并保存其中一个购物清单时,保存功能也会调用一个类方法来增加我的字典中的一个值(如历史记录)。 这就是save函数调用的内容:

d = date.today()
y = d.year
m = d.month
Establishment.check_year_existence(y, m)

现在,关于班级方法。 字典列表将根据将在之前看到的类方法调用中传递的年份来保存字典。 如果有一个为该年份注册的字典,则增量仅基于月份。

例如,我们在2015年,方法收到(2015年,2年)年和月,如果已经在2015年注册了字典,该方法不会创建另一个,它只会增加值这个月。

{'Year': 2015, 'Jan': 5, 'Feb': 0, ...}
+ 1 (increment)
{'Year': 2015, 'Jan': 5, 'Feb': 1, ...}

这是类方法:

global info_estab
info_estab = []

@classmethod
def check_year_existence(cls, y, m):

    #for i, index in enumerate(info_estab):

    if info_estab.key('Year').index(y):
        ?
    else:

        new_info = {'Year': date.today().year, 'Jan': 0, 'Feb': 0, 'Mar': 0, 'Apr': 0, 
'Mai': 0, 'Jun': 0, 'Jul': 0, 'Aug': 0, 'Sep': 0, 'Oct': 0, 'Nov': 0, 'Dec': 0}
        new_info.key(mes).index = 1
        info_estab.append(new_info)

尽管我试图找到答案并阅读有关它以尝试解决我的问题,但我仍然不知道如何进行此验证,因为我不是一个' python亲'

我该怎么做这个验证?

2 个答案:

答案 0 :(得分:0)

您可以在info_estab字典中迭代您的条目并检查年份值。

for entry in info_estab:
    if entry.get('Year') == y:
        entry[m] += 1
    else:
        new_info = {'Year': y, 'Jan': 0, 'Feb': 0, 'Mar': 0, 'Apr': 0, 'Mai': 0, 'Jun': 0, 'Jul': 0, 'Aug': 0, 'Sep': 0, 'Oct': 0, 'Nov': 0, 'Dec': 0}
        new_info[m] = 1
        info_estab.append(new_info)

答案 1 :(得分:0)

只是想让这个更高效(取决于你要插入多少年)。您可以将info_estab本身设为字典,以年份为关键字。您也不需要一种方法用于新条目,一种方法用于递增。它可以用一种紧凑的方法完成。

global info_estab
info_estab = {}

@classmethod
def increment_month(cls, y, m):

    if y not in info_estab:
        new_info = {'Jan': 0, 'Feb': 0, 'Mar': 0, 
                    'Apr': 0, 'Mai': 0, 'Jun': 0, 'Jul': 0, 'Aug': 0, 
                    'Sep': 0, 'Oct': 0, 'Nov': 0, 'Dec': 0}
        info_estab[y] = new_info              
    info_estab[y][m] += 1

我建议的另一件事是尽量避免使用全局变量。它可以使代码更难理解。但是没有进一步的上下文,我不确定将变量封装在类中的最佳方法(可能是类变量,因为这是一个类方法?)。