【问题标题】:Comparing Times From 2 Different Lists With Nested For-Loop使用嵌套 For 循环比较 2 个不同列表的时间
【发布时间】:2018-08-03 17:28:58
【问题描述】:

在我的代码中,我有一个名为 stamp 的列表和一个名为 focal 的列表。两个列表中都有时间戳,我需要在 stamp 中找到最后一个时间戳,并且大于每个 focal 但小于 focal 中的下一个元素,并将其附加到名为 times 的列表中

这是每个列表中的一个小样本集:

  • stamp

['2018-07-21,11:37:37', '2018-07-21,11:37:48', '2018-07-21,11:37:52', '2018-07-21,11:38:12', '2018-07-21,11:38:45', '2018-07-21,11:39:04', '2018-07-21,11:39:51', '2018-07-21,11:41:36', '2018-07-21,11:41:52', '2018-07-21,11:42:01', '2018-07-21,11:42:24', '2018-07-21,11:42:27', '2018-07-21,11:43:01', '2018-07-21,11:43:56', '2018-07-21,11:44:13', '2018-07-21,11:44:24', '2018-07-21,11:45:20', '2018-07-21,11:45:32', '2018-07-21,11:45:40', '2018-07-21,11:45:51', '2018-07-21,11:46:20', '2018-07-21,11:46:36', '2018-07-21,11:49:01', '2018-07-21,11:50:12', '2018-07-21,11:50:45', '2018-07-21,11:51:16', '2018-07-21,11:51:32', '2018-07-21,11:51:47', '2018-07-21,11:52:10', '2018-07-21,11:52:13', '2018-07-21,11:52:16', '2018-07-21,11:52:19', '2018-07-21,11:53:22']

  • focal

    ['2018-07-21,11:37:20', '2018-07-21,11:52:57']

所以要附加到times 的项目是[2018-07-21,11:52:19]

我目前要做的代码是:

for x in range(len(focal)-1): for y in range(len(stamp)): if focal[x] <= stamp[y] and stamp[y] < focal[x+1]: times.append(stamp[y])

但它没有做我想做的事,我不知道从这里去哪里。

【问题讨论】:

  • 这些列表是否都保证按排序顺序排列?
  • 这不等于stamp元素在focal的最大值和最小值之间吗?
  • @abarnert 是的,它们将始终按顺序排序

标签: python python-3.x for-loop nested-loops


【解决方案1】:

现在,您正在附加所有大于焦点 [x] 但小于焦点 [x+1] 的内容。如果您只想使用此属性附加最后一个元素,请尝试以下操作:

for x in range(len(focal)-1):
    for y in range(len(stamp)-1):
        if focal[x] <= stamp[y] and stamp[y] < focal[x+1] and stamp[y+1] >= focal[x+1]:
            times.append(stamp[y])

【讨论】:

    【解决方案2】:

    循环很难阅读。使用列表推导。

    第一步是将您的要求形式化,以便于理解。基本上你想找到focal[x] &lt; stamp &lt; focal[x+1] 的所有元素并取最高值。

    通过列表理解,这是一行:

    max([x for x in stamp if focal[x] < x < focal[x+1]])
    

    如果stamp 中的值未排序,此代码也有效。

    放入一个循环:

    for x in range(len(focal)-1):
        times.append(max([x for x in stamp if focal[x] < x < focal[x+1]]))
    

    如果你真的想要在焦点给定的范围内stamp 中的最后一个(而不是最新的)值,你可以像这样得到它:

    [x for x in stamp if focal[x] < x < focal[x+1]][-1]
    

    此外,请注意,日期的字符串比较可能不是超级可靠,具体取决于您的数据。这只是按字母顺序比较。考虑将日期存储为某种日期类型。

    【讨论】:

    • ISO Y-M-D H:M:S 格式是专门设计的,因此它们可以作为字符串排序。
    【解决方案3】:

    您可以利用itertools.takewhile

    from itertools import takewhile
    
    stamp = ['2018-07-21,11:37:37', '2018-07-21,11:37:48', '2018-07-21,11:37:52', '2018-07-21,11:38:12', '2018-07-21,11:38:45', '2018-07-21,11:39:04', '2018-07-21,11:39:51', '2018-07-21,11:41:36', '2018-07-21,11:41:52', '2018-07-21,11:42:01', '2018-07-21,11:42:24', '2018-07-21,11:42:27', '2018-07-21,11:43:01', '2018-07-21,11:43:56', '2018-07-21,11:44:13', '2018-07-21,11:44:24', '2018-07-21,11:45:20', '2018-07-21,11:45:32', '2018-07-21,11:45:40', '2018-07-21,11:45:51', '2018-07-21,11:46:20', '2018-07-21,11:46:36', '2018-07-21,11:49:01', '2018-07-21,11:50:12', '2018-07-21,11:50:45', '2018-07-21,11:51:16', '2018-07-21,11:51:32', '2018-07-21,11:51:47', '2018-07-21,11:52:10', '2018-07-21,11:52:13', '2018-07-21,11:52:16', '2018-07-21,11:52:19', '2018-07-21,11:53:22']
    focal = ['2018-07-21,11:37:20', '2018-07-21,11:52:57']
    
    print([*takewhile(lambda v: focal[0] < v < focal[1], stamp)][-1])
    

    输出:

    2018-07-21,11:52:19
    

    【讨论】:

      猜你喜欢
      • 2017-12-18
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多