2013-02-27 2 views
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. 
} 

I попросите мой цикл кода во втором словаре, сначала обратив внимание на первые 4 символа в ключе (год), и если это НЕ в словаре, я инициализирую этот ключ вместе со значением двенадцати пробелов в форме списка : [0,0,0,0,0,0,0,0,0,0,0,0,0], затем измените значение элемента в этом списке позиции месяца на любое значение. Если год в словаре, я просто хочу, чтобы элемент в списке был равен значению этого месяца. Мой вопрос в том, как мне получить доступ и установить конкретный элемент в списке в словаре. Я сталкиваюсь с рядом ошибок, которые не особенно полезны для Google.

вот мой код:

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

Сообщите мне, если я смогу прояснить ситуацию. Спасибо, что посмотрели.

+3

'monthdict (ключ)' должен быть 'monthdict [ключ]' –

+0

Что такое 'tabhash' в вашем коде, вы имеете в виду' yeardict'? –

+0

@ F.J да, извините, я изменил имя переменной, чтобы сделать все более ясным и забыл изменить его повсюду. –

ответ

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] 

Обратите внимание, что я предположил, что январь в вашем формате дата 01 не 00, если это не так, используйте dmonth вместо dmonth-1 в последней строке.

+1

+1, но может быть сокращен далее, чтобы избежать утверждения 'if', используя' yeardict.setdefault (year, [0] * 12) [dmonth-1] = monthdict [key] ' –

+0

Это прекрасно. Благодарим вас за исправление моей проблемы и заставив ее выглядеть намного опрятно! –

+0

Я запустил это в некоторых из моих более крупных фактических словарей (месяцев), и они возвращаются: «IndexError: индекс назначения списка вне диапазона». Любые идеи, с которых начать отладку? Некоторые ответы говорят добавить, а не устанавливать равные (http://stackoverflow.com/questions/5653533/indexerror-list-assignment-index-out-of-range), но это не сработает в моем случае, когда вопросы упорядочения , –

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 не поможет. Re написал ответ просто по умолчанию получить и сделать копию этого списка

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]} 
>>> 
Смежные вопросы