0

我正在尝试创建一个数据结构来跟踪多年来每月发生的事件。我已确定列表字典是最佳选择。我想创建类似这样的结构(年份:代表每月出现次数的十二个整数的列表):

yeardict = {
'2007':[0,1,2,0,3,4,1,3,4,0,6,3]
'2008':[0,1,2,0,3,4,1,3,5,0,6,3]
'2010':[7,1,3,0,2,6,0,6,1,8,1,4]
}

我将一个如下所示的字典作为输入:

monthdict = {
'2007-03':4,
'2007-05':2,
'2008-02':8
etc.
}

我让我的代码循环通过第二个字典,首先注意键(年份)中的前 4 个字符,如果字典中没有,那么我初始化该键以及列表中十二个空白月的值形式:[0,0,0,0,0,0,0,0,0,0,0,0],然后将该月份位置列表中的项目的值更改为任何值。如果年份在字典中,那么我只想将列表中的项目设置为等于该月的值。我的问题是如何访问和设置字典中列表中的特定项目。我遇到了一些对谷歌没有特别帮助的错误。

这是我的代码:

    yeardict = {}
    for key in sorted(monthdict):
        dyear = str(key)[0:4]
        dmonth = str(key)[5:]
        output += "year: "+dyear+" month: "+dmonth
        if dyear in yeardict:
            pass
#            yeardict[str(key)[0:4]][str(key)[5:]]=monthdict(key)                
        else:
            yeardict[str(key)[0:4]]=[0,0,0,0,0,0,0,0,0,0,0,0]
#            yeardict[int(dyear)][int(dmonth)]=monthdict(key)

被注释掉的两行是我想要实际设置值的地方,当我将它们添加到我的代码中时,它们会引入两个错误之一:1. 'dict' 不可调用 2. KeyError: 2009

让我知道我是否可以澄清任何事情。谢谢你的关注。

4

3 回答 3

5

这是我将如何写这个:

yeardict = {}
for key in monthdict:
    try:
        dyear, dmonth = map(int, key.split('-'))
    except Exception:
        continue  # you may want to log something about the format not matching
    if dyear not in yeardict:
        yeardict[dyear] = [0]*12
    yeardict[dyear][dmonth-1] = monthdict[key]

请注意,我假设您的日期格式中的 January01不是00,如果不是这种情况,请在最后一行中使用dmonth而不是。dmonth-1

于 2013-02-27T21:56:27.327 回答
0
defaultlist = 12*[0]
years = {}
monthdict = {
'2007-03':4,
'2007-05':2,
'2008-02':8
}

for date, val in monthdict.items():
    (year, month) = date.split("-")
    occurences = list(years.get(year, defaultlist))
    occurences[int(month)-1] = val
    years[year] = occurences

实际上编辑, defaultdict 无济于事。重新编写答案以执行默认获取并复制该列表

于 2013-02-27T21:54:08.970 回答
0

这有你想要的行为吗?

>>> yeardict = {}
>>> monthdict = {
... '2007-03':4,
... '2007-05':2,
... '2008-02':8 }
>>> for key in sorted(monthdict):
...     dyear = str(key)[0:4]
...     dmonth = str(key)[5:]
...     if dyear in yeardict:
...         yeardict[dyear][int(dmonth)-1]=monthdict[key]
...     else:
...         yeardict[dyear]=[0]*12
...         yeardict[dyear][int(dmonth)-1]=monthdict[key]
... 
>>> yeardict
{'2008': [0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], '2007': [0, 0, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0]}
>>> 
于 2013-02-27T21:56:54.190 回答