2015-06-10 3 views
-1

Я реализую ежемесячный календарь в django и использовал код, который я нашел в Интернете. Внутри кода есть лямбда-функция, которую мне нужно настроить для моего конкретного использования.Объясните этот python lambda

def group_by_day(self, event): 
     field = lambda event: event.start.day 
     return dict(
      [(day, list(items)) for day , items in groupby(event, field)] 
     ) 

Из того, что я прочитал в Интернете:

group_by_day() строит словарь с дня месяца, как ключевой и любые тренировки в течение того дня, как его значение (http://uggedal.com/journal/creating-a-flexible-monthly-calendar-in-django/)

Im совершенно новый для python и проблемы с выяснением того, как он на самом деле делает свою магию. Я понимаю, что он использует event.start.day, чтобы назначить его на день и месяц. Это делает это с рекурсией?

Я пытаюсь настроить функцию так, чтобы она поддерживала повторяющиеся/многодневные события.

Thanks

+0

Все лямбда-это возвращает часть дня начала мероприятия. * Magic * находится в функции 'groupby()', которая создает группы на основе этого возвращаемого значения. Каждый раз, когда значение изменяется от одного события к другому, вы получаете новую группу. –

ответ

1

Все лямбда делает возвращают дневная часть даты начала мероприятия; lambda объекты - это просто функции. Реальный magic находится в itertools.groupby() function, который производит группы на основе этого возвращаемого значения. Каждый раз, когда значение изменяется от одного события к другому, вы получаете новую группу.

В зависимости от того, как реализован ваш многополярный/повторяющийся процесс, вероятно, нелегко будет адаптировать его непосредственно к вашему делу. Вам придется переключиться на цикл со словарем.

Вот эквивалентная функция, используя только цикл, который будет легче адаптироваться:

def group_by_day(self, event): 
    result = {} 
    for e in event: 
     day = event.start.day 
     result.setdefault(day, []).append(event) 
    return result 

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

+0

Я понял, что лямбда не была такой _magic_ после предыдущего ответа. Большое спасибо, это именно то, что мне нужно. –

0

Лямбда-функции как обычные функции. Например:

f = lambda x:x**2 

Является equivelent к:

def f(x): 
    return x**2 

Таким образом, в вашем случае, для поля (событие), возвращение event.start.day

0

Существует три отдельных бита магии: лямбда, понимание списка и функция groupby.

Заявление lambda event: event.start.day эквивалентно:

def f(event): 
    return event.start.day 

groupby функция предположительно принимает event и field и возвращает какой-то список списков двух элементов (или кортежей).

Список понимание [(day, list(items)) for day , items in groupby(event, field)] эквивалентно:

result = [] 
for day, items in groupby(event, field): 
    result.append((day, list(items))) 

И тогда dict вызова принимает, что список кортежей и превращает его в Словарь из day:list(items) пар.

Смежные вопросы