使用嵌套循环比较2个不同列表中的时间

时间:2018-08-03 17:28:59

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

在我的代码中,我有一个名为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])

但是它不执行我想要的操作,我不确定从这里去哪里。

3 个答案:

答案 0 :(得分:1)

现在,您要追加所有大于focus [x]但小于focus [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])

答案 1 :(得分:0)

对此很难理解。使用列表理解。

第一步是规范您的要求,以便于理解。基本上,您想查找所有focal[x] < stamp < 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中的最后一个值(相对于最新值)在focus给出的范围内,则可以这样获得:

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

此外,请注意,根据您的数据,日期的字符串比较可能不是非常可靠。这只是字母比较。考虑将日期存储为某种日期类型。

答案 2 :(得分:0)

您可以利用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