Создание понимания вложенного словаря в Python 2.7

У меня есть вложенный кортеж, возвращаемый из MySQL cursor.fetchall(), содержащий некоторые результаты в форме (datetime.date, float). Мне нужно разделить их на вложенный словарь формы [месяц/год][день месяца], поэтому я хотел бы иметь показания словаря (скажем), на которые я бы ссылался как < em>readings['12/2011'][13], чтобы получить показания на 13-й день месяца '12/2011'. Это делается с целью создания графиков, показывающих наложенные ежедневные показания за несколько месяцев.

Моя трудность в том, что (я считаю) мне нужно настроить первое измерение словаря с уникальными идентификаторами месяца/года. В настоящее время я получаю список из них через:

list(set(["%02d/%04d" % (z[0].month, z[0].year) for z in raw]))

где raw — это список кортежей, возвращенных из базы данных.

Теперь я могу легко сделать это как двухэтапный процесс: настроить первое измерение словаря, затем еще раз просмотреть данные, чтобы настроить второе. Однако мне было интересно, есть ли удобочитаемый способ выполнить оба шага одновременно, возможно, с вложенными пониманиями словаря/списка.

Буду благодарен за любой совет. Спасибо.


person TimGJ    schedule 11.02.2012    source источник
comment
Разве вам не нужно будет сортировать месяцы на каком-то этапе? Есть ли веская причина, по которой у вас нет месячных ключей в естественном порядке, например. '2011-12' даже если вы не собираетесь их сортировать?   -  person John Machin    schedule 11.02.2012
comment
Неплохая мелочь. Спасибо. Они представлены в формате «мм/гггг», потому что это метки серий, которые используются на разных кривых на графике, а 12/2011 более удобочитаемо (конечно, для британской аудитории), чем дата в формате ISO. Но очень хороший момент.   -  person TimGJ    schedule 12.02.2012


Ответы (1)


кажется сложным сделать оба уровня в краткой форме, вместо этого я предлагаю вам использовать defaultdict вот так:

res = defaultdict(dict)
for z in raw:
    res["%02d/%04d"%(z[0].month, z[0].year)][z[0].day] = z
person ptitpoulpe    schedule 11.02.2012