【问题标题】:Iteration over dictionary - Python迭代字典 - Python
【发布时间】:2015-02-08 00:21:09
【问题描述】:

我在使用字典列表时遇到了问题。 有一个保存列表的功能(如购物清单)。当用户创建并保存这些购物清单之一时,保存函数还将调用一个类方法来增加我的字典中的一个值(如历史记录)。 这就是保存函数的调用:

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

现在,关于类方法。 字典列表将根据将通过之前看到的 classmethod 调用传递的年份保存字典。 如果有当年注册的字典,则增量将仅基于月份。

比如我们在2015年,方法receive(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 pro”。

我该如何进行此验证?

【问题讨论】:

    标签: python list python-2.7 dictionary


    【解决方案1】:

    您可以遍历 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)
    

    【讨论】:

      【解决方案2】:

      只是想提高性能(取决于您要插入多少年)。您可以使 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
      

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

      【讨论】:

        猜你喜欢
        • 2013-12-03
        • 1970-01-01
        • 2014-05-29
        • 2021-07-24
        • 2018-04-06
        • 2015-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多