如果通过事件列表进行迭代,我该如何在某个条件下停止并通过列表向后迭代。例如
for p in pattern:
for event in p:
if event == 1:
# Iterate backwards through p from current position until you reach the last event that equals 1
我认为您可以使用诸如reversed(p)
之类的东西,但这将从p
的末尾开始,我想开始从当前位置进行查看。
循环的python无效,我认为您期望它的期望。当您在此处致电for
时,Python实际上将p[i]
分配给变量event
的新副本。它没有下一个对象或先前的对象。
如果您想知道当前的位置是什么,则需要使用enumerate()
函数。
for index, event in enumerate(p):
print(index, event)
这将允许您打破循环或创建另一个subloop,然后使用reversed()
或类似的东西从指定点重新换句。
您的代码看起来像:
for p in pattern:
for index, event in enumerate(p):
if event == 1:
for event2 in reversed(p[:index]):
# do the things
我假设您不需要枚举逆转。如果您这样做,将最内向的for
语句更改为for in enumerate(reversed(p[:index]):
应该可以做到。
,我使用了其他事件变量,以防您想引用最初向您降低逆转的变量。如果您不需要该功能,那不是必需的。
选项2:
可以使用p.index(event)
值完成另一种方法(感谢@Scott(。它的pythonic少了,会打破您现有的循环(也许可能不重要(,但确实可以。
for p in pattern:
for event in p:
if event == 1:
new_start = p.index(event)
for p in reversed(p[:new_start]):
要反向方向,您需要在迭代时记住位置索引。枚举((内置功能将有所帮助。
找到反转条件后,请使用列表切片来隔离要向后重复的部分。 reversed((内置将从那里拿走。
>>> loe = ['e0', 'e1', 'e2', 'e3', 'e4', 'e5']
>>> for i, event in enumerate(loe):
print event
if event == 'e3':
for event in reversed(loe[:i]):
print event
break
e0
e1
e2
e3
e2
e1
e0
希望这会有所帮助: - (
只需记录索引,然后向后启动遍历:应该看起来像这样。
pattern = [[3,4,5],[7,8,9],[3,2,1,5,7,1],[8,1,8,8,1]]
for i in range(0, len(pattern)):
for j in range(0, len(pattern[i])):
print(pattern[i][j])
if(pattern[i][j] == 1):
print("found a event equals to 1")
if(j == 0):
print(" but its at the start of the list so there are no event equals to 1 before")
else:
reserveStartingIndex = j - 1 #to exclude itself
for r in range (reserveStartingIndex, 0, -1):
if(pattern[i][r] == 1):
print("found a event equals to 1 before at the index of: " + repr(r) )
elif(r == 0):
print("no event equals to 1 before")
您会得到这样的结果:
3
4
5
7
8
9
3
2
1
found a event equals to 1
5
7
1
found a event equals to 1
found a event equals to 1 before at the index of: 2
8
1
found a event equals to 1
8
8
1
found a event equals to 1
found a event equals to 1 before at the index of: 1