【问题标题】:Python: Progress the index for a for loopPython:为 for 循环推进索引
【发布时间】:2016-01-18 22:57:57
【问题描述】:

有没有办法在 python 的 for 循环中向前移动索引?例如,如果我正在遍历一个字符串并找到一些我正在寻找的字符,我可以在 for 循环的下一次迭代中从该位置开始读取吗?

就像,在读完一个 x 之后,读到一个 y 并在下一次迭代中从 y 之后的位置开始:

for i in range(len(myString)):
  if myString[i] == 'x':
    j = i + 1
    while( myString[j] != '\n' ):
      if( myString[j] == 'y' ):
        i = j + 1  # start at position following y in string on the next iteration
      j = j + 1

或者我必须使用while循环来实现这一点吗?

【问题讨论】:

标签: python string loops indexing iteration


【解决方案1】:

您可以在此示例代码中使用字符串而不是列表。它在列表的剩余部分中找到第一个 x,然后在那个 'x' 之后找到第一个 y,依此类推

#mylist = [list to search]
i = 0
while true:
    list_to_search = mylist[i:]
    if 'x' not in list_to_search:
        break
    j = list_to_search.index('x')
    if 'y' not in list_to_search[j+1:]:
        break
    i = list_to_search.index('y')
    (x_pos,y_pos)  = (j,i)
    #your code

【讨论】:

  • @alivar Nice。没想到用拼接。
【解决方案2】:

您可以尝试使用无限循环:

while true:
   if i >= len(myString): # Exit condition
      break

   # do something with myString[i]

   # set i as you want

【讨论】:

  • @Christian 这是一个不错的选择。我会试一试。谢谢。
  • 我认为应该是if i >= len(myString)。否则当i == len(myString) 时它会超出范围。否则,这很适合我的目的。
【解决方案3】:

现在,您实际上仍在使用 while 循环 - 但我认为这在精神上更接近您的想法:

def myrange(limit=0):
    counter = 0
    while counter < limit:
        next = yield counter
        try:
            counter = int(next) - 1
        except TypeError:
            counter += 1    


mylist = ['zero', 'one', 'two', 'five', 'four']       
my_iter = myrange(len(mylist))

for i in my_iter:
    print(mylist[i])
    if mylist[i] == 'five':
        print('-- three, sir! --')
        mylist[i] = 'three!'
        my_iter.send(i)
    elif mylist[i] == 'four':
        print("Don't count that number!")

这是因为生成器具有send 函数。它们允许您向生成器发送一个值,然后生成器可以按照自己的意愿使用该值。请注意,当您在生成器上调用.send() 时,它将产生下一个值(所以当我们调用my_iter.send(i) 时,实际上是yield 生成下一个值。这就是我们调用counter = int(next) - 1 的原因。替代方法是将-1 放入您的for 循环中。

【讨论】:

  • @Wayne Werner 我对 python 还很陌生,所以我认为这个例子比我现在的工资等级高一点。不过,我肯定会玩弄它。感谢您的反馈。
猜你喜欢
  • 2022-06-13
  • 2018-03-16
  • 2020-09-09
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
  • 2013-03-19
相关资源
最近更新 更多