我正在django中实施每月日历,并使用了我在网上找到的一些代码。在代码中有一个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/)
我对python很新,并且在弄清楚它实际上是如何做它的魔法时遇到了问题。我确实理解它使用event.start.day
将其分配给日期和月份。这是用递归做的吗?
我试图调整功能,以便支持重复/多日活动。
由于
答案 0 :(得分:1)
所有lambda都返回事件开始日期的日期部分; 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
这不依赖于事件的顺序,因为它只是将每个日期按日分组,而不管它在序列中出现的位置。这应该允许您将事件添加到超过一天。
答案 1 :(得分:0)
Lambda函数就像常规函数一样。例如:
f = lambda x:x**2
是否等同于:
def f(x):
return x**2
因此,在您的情况下,对于field(事件),请返回event.start.day
答案 2 :(得分:0)
魔法有三个独立的部分:lambda,list comprehension和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)
对的字典。