迭代字典 - Python
Iteration over dictionary - Python
我在使用字典列表时遇到问题。
有一个保存列表(如购物清单)的功能。当用户创建并保存这些购物清单之一时,保存功能还将调用类方法来增加我的字典的值之一(如历史记录)。
这是保存函数调用的内容:
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 pro'。
我该如何验证?
您可以遍历 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)
只是想提高性能(取决于您要插入多少年)。您可以使 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
我唯一建议的另一件事是尽量避免使用全局变量。它会使代码更难理解。但是如果没有进一步的上下文,我不确定将变量封装在 class 中的最佳方法(可能是 class 变量,因为这是一个 class 方法?)。
我在使用字典列表时遇到问题。 有一个保存列表(如购物清单)的功能。当用户创建并保存这些购物清单之一时,保存功能还将调用类方法来增加我的字典的值之一(如历史记录)。 这是保存函数调用的内容:
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 pro'。
我该如何验证?
您可以遍历 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)
只是想提高性能(取决于您要插入多少年)。您可以使 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
我唯一建议的另一件事是尽量避免使用全局变量。它会使代码更难理解。但是如果没有进一步的上下文,我不确定将变量封装在 class 中的最佳方法(可能是 class 变量,因为这是一个 class 方法?)。