遍历多个列表?

时间:2018-06-25 01:39:27

标签: python list

在我的程序中,我掌握了当前时间。然后,我想检查当前时间是否大于t1且小于t2。 例如:

00,00 <= dt.time() <= 06,00
06,01 <= dt.time() <= 12,00
12,01 <= dt.time() <= 18,00 
etc...

我正在做的是检查当前时间是一天中的哪个时段。

如果4条语句中的一条最终为真,则我的程序将继续执行另一个函数。

现在,我的程序的行为就像所有4条语句都正确,并且循环了几次。

当我打印所有内容以查看其功能时,看起来好像只是将t1中的4个对象中的每一个与t2中4个对象中的最后一个进行了比较。

有没有办法正确地做到这一点?

这是我正在从事的工作...

from datetime import datetime, date, time

p1 = 1
p2 = 2
p3 = 3
p4 = 4

what_number_should_be = 3

def cycle():
    dt = datetime.now()
    t1 = [time(00,00), time(06,01), time(12,01), time(18,01)]
    t2 = [time(06,00), time(12,00), time(18,00), time(23,59)]
    user_number = [p1, p2, p3, p4]

    # I think the next 3 lines are throwing me off
    for x in t1:
        for y in t2:
            for z in user_number:

                # check if current date is between times listed in t1 and t2
                if x <= dt.time() <= y:
                    print(x, dt.time(), y)
                    print(z)
                    # if above is true, then check
                    # if user_number does not equal 3
                    if what_number_should_be != z:
                        print(z, " did not equal ", what_number_should_be)
                        # should only end up here once

cycle()

3 个答案:

答案 0 :(得分:1)

如果我对问题的理解正确,则可以用

替换3个for循环

for x, y, z in zip(t1, t2, user_number):

Zip为您提供每个列表中的相应元素: zip Documentation

答案 1 :(得分:1)

您可以将t1,t2和user_number数组压缩在一起,这将产生一个元组列表

[(time(00,00), time(06,00), p1), (time(06,01), time(12,00), p2), (time(12,01), time(18,00), p3), (time(18,01), time(23,59), p4)]

然后像这样运行循环

for x in zip(t1, t2, user_number):
    if x[0] <= dt.time() <= x[1]:
        print(x[0], dt.time(), x[1])
        print(x[2])
        if what_number_should_be != x[2]:
            print(x[2], " did not equal ", what_number_should_be)

答案 2 :(得分:0)

如果我正确理解,对于给定的时间dt,您想确定其所在日期的“象限”,您已选择用以下方式对其进行编码:

  • 如果dt在00,00到06,00之间,则它位于象限1
  • 如果dt介于06,01和12,00之间,则它位于象限2
  • 如果dt介于12,01和18,00之间,则它位于象限3
  • 如果dt介于18,01和23,59之间,则它位于象限4

我还收集到您希望您的for循环仅打印3,因为您恰巧在12,01到18,00之间实时运行此程序。

如果我对问题的理解是正确的,那么您使用两个数组来完成此任务很聪明,我们可以使用它们来发现解决方案。通过观察到,由于我们要检查的确有4个象限,因此我们可以推断出仅需要迭代4次,每个象限一次即可。

可以这样写:

dt

我希望这会有所帮助!