Python:用零补充缺少的月份

时间:2011-05-08 18:46:28

标签: python

我有一个字典列表,如下所示。每个字典保存特定月份的总数。如果列表中没有出现月份,例如1月份,则总计应为零。

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

即Jan为0,2月为3,March为1等。

我知道我可以使用这样的东西来获取值:

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

但是如何为不存在的月份创建零值条目?

7 个答案:

答案 0 :(得分:3)

只需遍历列表,然后根据月份值进行分配。

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

答案 1 :(得分:2)

result = [0]*12
for r in q:
    result[int(r['month'])-1] = r['total_item']

答案 2 :(得分:1)

使用此:

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

然后您可以使用此对象而不是普通字典。它就像它一样,但是当你访问一个不存在的项时,它会创建一个值为0的项目。

答案 3 :(得分: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]

答案 4 :(得分: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)]

答案 5 :(得分: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))。

答案 6 :(得分: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]