Python / Django - Построить список по сумме по дням и неделям - PullRequest
2 голосов
/ 09 ноября 2011

Надеюсь, я смогу объяснить, чего я пытаюсь достичь. У меня нет проблем с достижением моего результата, но я знаю, что это, вероятно, не лучший способ сделать это.

У меня есть таблица с некоторыми записями по дате. Я пытаюсь взять эти записи из текущего месяца и упорядочить их по списку по неделям, а затем суммировать значения из таблицы для каждого дня недели. Конечный результат будет выглядеть примерно так:

{44: {4: Decimal('2.80'), 5: Decimal('6.30')}, 45: {1: Decimal('8.90'), 2: Decimal('10.60')}}

У меня есть решение. Но я знаю, что это не лучший способ сделать это. Любые идеи о том, как сделать это лучше?

#Queries the database and returns time objects that have fields 'hours' and 'date'
time = self.month_time()

r = {}
for t in time:
    #Get the week of the year number
    week = t.date.isocalendar()[1]

    #Get the day of the week number
    day = t.date.isoweekday()

    if week not in r:
        r.update({week:{}})
    if day not in r[week]:
        r[week][day] = 0

    r[week][day] = r[week][day] + t.hours

1 Ответ

1 голос
/ 09 ноября 2011

Я думаю, что вы, вероятно, ищете defaultdict.defaultdict аналогичен словарю, за исключением случаев, когда KeyError генерируется с dict, для создания начального значения используется заводская функция, заданная при инициализации.

В вашем случае вам понадобитсяdefaultdict для days, вложенный в один для weeks.Я думаю, что это будет работать для вас:

from collections import defaultdict

r = defaultdict(lambda: defaultdict(int))
for t in time:
    week = t.date.isocalendar()[1]
    day = t.date.isoweekday()
    r[week][day] += t.hours
...