循环遍历元组的所有行,并在满足条件后返回一个值



这个玩具示例代表了我解析模拟包中数据时遇到的一个问题。我想在元组中循环,如果满足特定条件,则中断循环并返回与该特定行对应的时间步长。在以下示例中,索引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语句中添加一个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语法的更多信息,请查看这篇StackOverflow文章。

替换

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

您可以使用这种方法

 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
 
  

我建议使用random.seed(),以使示例可复制(教程(。

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

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子句。

一旦满足条件,就可以使用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

最新更新