【问题标题】:Loop though all rows of tuple and return a value once a condition is met遍历元组的所有行并在满足条件后返回一个值
【发布时间】:2020-07-22 18:41:16
【问题描述】:

这个玩具示例代表了我从模拟包解析数据时遇到的问题。我想循环遍历一个元组,如果满足特定条件,则中断循环并返回与该特定行对应的时间步长。在以下示例中,索引 0 表示这些时间步长。

from random import randint

t = list(range(1,11))
a = [randint(1, 10) for i in range(0, 10)]
b = [randint(1, 10) for i in range(0, 10)]
c = [randint(1, 10) for i in range(0, 10)]
d = [randint(1, 10) for i in range(0, 10)]
e = [randint(1, 10) for i in range(0, 10)]

for i in zip(t,a,b,c,d,e):
    print (i)

(1, 8, 5, 5, 3, 4)
(2, 2, 9, 5, 9, 1)
(3, 9, 3, 1, 6, 3)
(4, 9, 6, 7, 8, 3)
(5, 2, 7, 6, 8, 10)
(6, 6, 6, 8, 9, 6)
(7, 1, 8, 1, 8, 3)
(8, 1, 1, 1, 7, 5)
(9, 6, 10, 7, 4, 6)
(10, 5, 2, 6, 3, 8)

假设我想返回数字 10 出现的第一个时间步。知道那是时间步 5 和 10 是行中的最后一个,我可以硬编码:

for i in zip(t,a,b,c,d,e):
    if i[5] == 10:
        print(i[0])
5

我试图以这种方式解决问题,但我不能完全弄清楚我哪里出错了,欢迎任何指针。

for i in zip(t,a,b,c,d,e):
    if i[1:] == 10:
        print(i[0])

【问题讨论】:

  • if 10 in i:print(i[0]);break
  • 谢谢普拉纳夫,不完全是。顺序很重要,这就是我使用循环的原因。即 10 可能会出现在更下方,但我只关心它的第一个实例,因为这实际上是一个时间序列

标签: python python-3.x


【解决方案1】:

就像其他人一样,在您的 if 声明中添加 break 声明。这会让你摆脱困境。

for i in zip(t, a, b, c, d, e):
    if 10 in i[1:]:
        print(i[0])
        break

但是,作为奖励,如果您想知道 10 是否从未出现在 i[1:] 中,可以在 for 循环的底部添加一个 else 语句,如下所示:

for i in zip(t, a, b, c, d, e):
    if 10 in i[1:]:
        print(i[0])
        break
else:  # If the loop never exited abnormally
    print("10 was never in i[1:]")

要了解有关for/else 语法的更多信息,请查看this StackOverflow 帖子。

【讨论】:

    【解决方案2】:

    替换

    for i in zip(t,a,b,c,d,e):
        if i[1:] == 10:
            print(i[0])
    

    for i in zip(t,a,b,c,d,e):
        if 10 in i:
            print(i[0])
            break
    

    【讨论】:

      【解决方案3】:

      你可以使用这种方法

       from random import randint
          
          t = list(range(1,11))
          a = [randint(1, 10) for i in range(0, 10)]
          b = [randint(1, 10) for i in range(0, 10)]
          c = [randint(1, 10) for i in range(0, 10)]
          d = [randint(1, 10) for i in range(0, 10)]
          e = [randint(1, 10) for i in range(0, 10)]
          
          for i in zip(t,a,b,c,d,e):
              print (i)
          
          for lst in zip(t,a,b,c,d,e):
              if 10 in lst:
                  print(lst[0])
                  break
       
      
        
      

      【讨论】:

        【解决方案4】:

        我建议使用random.seed(),使示例可重现 (tutorial)。

        从那里开始,就像你做的那样:

        from random import randint
        import random
        
        random.seed(42)
        ten_numbers = range(0, 10)
        t = list(range(1,11))
        a = [randint(1, 10) for i in ten_numbers]
        b = [randint(1, 10) for i in ten_numbers]
        c = [randint(1, 10) for i in ten_numbers]
        d = [randint(1, 10) for i in ten_numbers]
        e = [randint(1, 10) for i in ten_numbers]
        

        可以继续:

        for index, each in enumerate(zip(t,a,b,c,d,e)):
            if any([EACH == 10 for EACH in each]):
                print(index)
                break
        else:
            print("10 couldn't be found")
        

        我们在哪里使用了for-else 子句。

        【讨论】:

          【解决方案5】:

          您可以使用break 调用来在满足条件后停止循环。

          list = [1,2,3,4,5,6,7,8,9,10]
          target = 5
          time_step = 0
          
          for time_step, value in enumerate(list):
              if value == target:
                  break
          

          如果您要处理多个列表,我建议检查哪个列表具有您要搜索的值,然后提取其索引。

          lists = [[1,2,3],
                   [4,5,6],
                   [7,8,9]]
          
          target = 5 
          time_step = 0
          
          for list in lists:
              if target in list:
                  for time_step, value in enumerate(list):
                      if value == target:
                          break
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-07-05
            • 1970-01-01
            • 1970-01-01
            • 2023-01-31
            • 1970-01-01
            • 2017-07-13
            • 1970-01-01
            相关资源
            最近更新 更多