Python - 按日期时间对象对 python 列表进行排序

发布于 2025-01-11 21:49:37 字数 978 浏览 0 评论 0原文

我有一个日期时间对象列表,它通过一个名为 Django Recurrence 的附加库从我的数据库附加到一个数组中。

我将其附加在 for 循环中,如下所示:

events = Events.objects.filter(...some conditions)
timeslots = []
for event in events:
    for occurence in event.recurrences.between(context['today'], context['end']):
    occurence_date = datetime.combine(occurence.date(), time(0, 0))
    timeslots.append({
                        'start_date': occurence_date + timedelta(hours=event.start_time.hour, minutes=event.start_time.minute),
                        'end_date': occurence_date + timedelta(hours=event.end_time.hour, minutes=event.end_time.minute),
                    })

然后它将输出为 [{'start_date': datetime.datetime(2022, 3, 7, 14, 0), 'end_date': datetime.datetime(2022, 3, 7, 15, 0)}, {'start_date': datetime.datetime(2022, 3, 8, 14, 0), ... }] 这太棒了。

事件循环的一个副作用是,它会在所有事件发生后添加其他事件,例如 3 月 1 日、3 月 5 日、3 月 10 日、3 月 2 日、3 月 4 日等等。我想订购它们在开始日期之前,这样我就可以在模板中以正确的顺序呈现它们。

谢谢

I have a list of datetime objects that's being appended into an array from my database with an additional library called Django Recurrence.

I append it as follows inside a for loop:

events = Events.objects.filter(...some conditions)
timeslots = []
for event in events:
    for occurence in event.recurrences.between(context['today'], context['end']):
    occurence_date = datetime.combine(occurence.date(), time(0, 0))
    timeslots.append({
                        'start_date': occurence_date + timedelta(hours=event.start_time.hour, minutes=event.start_time.minute),
                        'end_date': occurence_date + timedelta(hours=event.end_time.hour, minutes=event.end_time.minute),
                    })

It would then output it as [{'start_date': datetime.datetime(2022, 3, 7, 14, 0), 'end_date': datetime.datetime(2022, 3, 7, 15, 0)}, {'start_date': datetime.datetime(2022, 3, 8, 14, 0), ... }] which is great.

A side effect from the events loop, is that it would add a the other events, after all the occurrences, eg 1 march, 5 march, 10 march, 2 march, 4 march, etc etc etc. I'd like to order them by the starting date, so I can render them out in the correct order in my template.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

美男兮 2025-01-18 21:49:37

如果你想对字典列表进行排序,你可以使用 sorted

但你必须传递你想要排序的 key,如下所示:

 sorted_timeslots = sorted(timeslots, key=lambda x: x['start_date'])

If you want to sort a list of dictionaries, you can use sorted,

but you have to pass the key you want to sort with, something like this:

 sorted_timeslots = sorted(timeslots, key=lambda x: x['start_date'])
一紙繁鸢 2025-01-18 21:49:37

您可以尝试 sorted 它接受两个参数:一个可迭代对象和一个键。后者指示函数应如何对前一个参数(数组)进行排序。我生成了一个更明确的示例:

timeslots  = [{'start_date': datetime.datetime(2022, 3, 7, 14, 0), 'end_date': datetime.datetime(2022, 3, 7, 15, 0)}, 
              {'start_date': datetime.datetime(2022, 3, 8, 14, 0) ,'end_date': datetime.datetime(2022, 3, 5, 14, 0)}, 
              {'start_date': datetime.datetime(2022, 3, 10, 20, 0) ,'end_date': datetime.datetime(2022, 3, 7, 13, 0)},
              {'start_date': datetime.datetime(2022, 3, 3, 20, 0) ,'end_date': datetime.datetime(2022, 3, 7, 11, 0)}
             ]
sorted(timeslots, key=lambda x: x["start_date"])

输出

[{'end_date': datetime.datetime(2022, 3, 7, 11, 0),
  'start_date': datetime.datetime(2022, 3, 3, 20, 0)},
 {'end_date': datetime.datetime(2022, 3, 7, 15, 0),
  'start_date': datetime.datetime(2022, 3, 7, 14, 0)},
 {'end_date': datetime.datetime(2022, 3, 5, 14, 0),
  'start_date': datetime.datetime(2022, 3, 8, 14, 0)},
 {'end_date': datetime.datetime(2022, 3, 7, 13, 0),
  'start_date': datetime.datetime(2022, 3, 10, 20, 0)}]

You can try sorted which takes two arguments: An iterable object, and a key. The latter indicates how the function should sort the former argument(array). I have generated an example to be more explicit:

timeslots  = [{'start_date': datetime.datetime(2022, 3, 7, 14, 0), 'end_date': datetime.datetime(2022, 3, 7, 15, 0)}, 
              {'start_date': datetime.datetime(2022, 3, 8, 14, 0) ,'end_date': datetime.datetime(2022, 3, 5, 14, 0)}, 
              {'start_date': datetime.datetime(2022, 3, 10, 20, 0) ,'end_date': datetime.datetime(2022, 3, 7, 13, 0)},
              {'start_date': datetime.datetime(2022, 3, 3, 20, 0) ,'end_date': datetime.datetime(2022, 3, 7, 11, 0)}
             ]
sorted(timeslots, key=lambda x: x["start_date"])

Output

[{'end_date': datetime.datetime(2022, 3, 7, 11, 0),
  'start_date': datetime.datetime(2022, 3, 3, 20, 0)},
 {'end_date': datetime.datetime(2022, 3, 7, 15, 0),
  'start_date': datetime.datetime(2022, 3, 7, 14, 0)},
 {'end_date': datetime.datetime(2022, 3, 5, 14, 0),
  'start_date': datetime.datetime(2022, 3, 8, 14, 0)},
 {'end_date': datetime.datetime(2022, 3, 7, 13, 0),
  'start_date': datetime.datetime(2022, 3, 10, 20, 0)}]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文