【问题标题】:I have two lists, I want to know if a date in one list is between two dates in another. How should I do this? [closed]我有两个列表,我想知道一个列表中的日期是否介于另一个列表中的两个日期之间。我该怎么做? [关闭]
【发布时间】:2017-05-25 12:33:40
【问题描述】:

我有一个如下所示的列表 A:

[((5.8, datetime.datetime(2016, 3, 5, 2, 8, 47))]

我有另一个列表 B,如下所示:

[((date1, datetime.datetime(2016, 2, 8, 1, 34)),
(date2, datetime.datetime(2016, 5, 2, 1, 42)),
(date3, datetime.datetime(2016, 10, 2, 11, 23))]

我想知道列表 A 中的日期是否介于列表 B 中的任何连续日期之间。换句话说,此处使用列表的输出将是:

[(5.8, date2)] 

这是因为列表 A 中的日期介于列表 B 的第一个日期和第二个日期之间。所以我从列表 A (5.8) 和 (date2) 中输出重要值。我不会使用 date1 或 date3 因为我想确保列表 1 中的日期在两个日期之间,并且我使用两个日期的后一个日期作为输出。

【问题讨论】:

  • 您尝试过解决这个问题吗?你能给我们看一些代码吗
  • 只是在我的脑海中......我真的不知道。我将研究 Moinuddin Quadri 的答案中的拉链!
  • 您应该在提问之前将问题分解为更简单的组成部分。假设您使用的是整数而不是日期;那么解决方案会很清楚吗?归结为一个问题,您是否可以像比较整数一样比较这些datetime 对象;换句话说,它们是完全有序集合的成员吗?这种问题分析是任何程序员的必备技能。
  • 你的 A 和 B 都有语法错误。

标签: python list datetime


【解决方案1】:

为了通过 Brute-Force 实现这一点,您可以使用 ziplist comprehension 表达式:

import datetime

list_a = [(5.8, datetime.datetime(2016, 3, 5, 2, 8, 47))]
#        v^  typo in actual list format       
list_b =[('date1', datetime.datetime(2016, 2, 8, 1, 34)),
          ('date2', datetime.datetime(2016, 5, 2, 1, 42)),
          ('date3', datetime.datetime(2016, 10, 2, 11, 23))]

my_list = [(num_a, str_b2) for num_a, date_a in list_a \
              for (str_b1, date_b1), (str_b2, date_b2) in zip(list_b, list_b[1:]) \
                   if date_b1 < a2 < date_b2]

my_list 持有的最终内容将是:

[(5.8, 'date2')]

【讨论】:

  • 相当简洁,但有点难看。如果你有时间,我相信 OP 和未来的读者会喜欢变量名和缩进 =)
  • zip 用于成对迭代列表 B,以便将列表 A 中的每个元素与列表 B 中的每对相邻元素进行比较。
  • 现在看起来还可以吗?我为将名称放入变量而摸不着头脑艰难的工作:/
  • @MoinuddinQuadri 可能很难命名变量,因为 OP 对这类事情的用例很难猜测。
猜你喜欢
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 2021-02-23
  • 2010-10-05
相关资源
最近更新 更多