2011-05-08 169 views
0

我有一个字典列表,如下所示。每本字典都包含特定月份的总数。如果一个月没有出现在列表中,例如1月份,则总数应为零。Python:用零填充缺失的月份

q = [{'total_item': 3, 'month': u'02'}, {'total_item': 1, 'month': u'03'}, {'total_item': 1, 'month': u'05'}, {'total_item': 5, 'month': u'06'}, {'total_item': 6, 'month': u'07'}, {'total_item': 1, 'month': u'10'}, {'total_item': 1, 'month': u'12'}] 

我想上面的数据结构转换成一个简单的列表,其中顺序位置代表月份和值表示的全部项目。

[0, 3, 1, 0, ...] # 12 entries in total - one for each month 

也就是说一月是0,二月是3月1等

我知道我可以使用这样的事情来获得当前值:

result = [r['total_item'] for r in q] 

但怎么办我为不存在的月份创建零值条目?

回答

3

只是在列表中循环,并根据月份值进行分配。

total_items = [0]*12 
for d in q: 
    month = int(d['month'], 10) 
    total_items[month-1] = d['total_item'] 
2
result = [0]*12 
for r in q: 
    result[int(r['month'])-1] = r['total_item'] 
+0

这会在12月产生一个IndexError :) – 2011-05-08 19:01:54

+0

不应该,如果January是'0' ...但显然输入数据是使用1作为'1',这很容易修复。 – Amber 2011-05-08 19:06:02

1

使用此:

class MyDict(dict): 
    def __missing__(self, key): 
     self[key] = 0 
     return self[key] 

然后你就可以改用普通字典的这个对象。它的作用就像它,但是当你访问一个不存在的项目,它将与0

+0

为什么不使用'collections.defaultdict'? – rubik 2011-05-08 19:02:28

+0

因为我是个虐待者 – 2011-05-08 19:43:39

1

尝试值创建它:

>>> months = [0] * 12 
>>> for r in q: months[int(r['month'])-1] = r['total_item'] 
>>> months 
[0, 3, 1, 1, 1, 5, 6, 6, 0, 1, 1, 1] 
1

还有一办法做到这一点.. 。图现有月份,他们total_item值,然后使用dict.get()0默认:

nitems = dict((int(x['month']), x['total_item']) for x in q) 
result = [nitems.get(i, 0) for i in range(1, 13)] 
+0

它是''nitems.get(i + 1,0)'' – eyquem 2011-05-08 20:23:51

+0

@eyquem:你说得对,谢谢,只是修正了示例代码 – 2011-05-10 18:16:25

0

较短的方法(因为字典理解的Python 2.7≥):

>>> d={int(i["month"]):i["total_item"] for i in q} #create a easier to use dict 
>>> d 
{2: 3, 3: 1, 5: 1, 6: 5, 7: 6, 10: 1, 12: 1} 
>>> [d.get(i,0) for i in range(1,13)] #d.get(i,0) returns 0 if i not in dict 
[0, 3, 1, 0, 1, 5, 6, 0, 0, 1, 0, 1] 
1

也许你会想使用scikits.timeseries:

http://pytseries.sourceforge.net/

例如:

import scikits.timeseries as TS 
aDate = TS.Date('M', '2010-01-01') 
myTS = TS.time_series(myData, start_date = aDate, freq = 'M') 

从那里你可以填充零和出口遗漏值(我相信使用myTS .fill伪(0))。