2011-05-08 101 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))。