>  Q&A  >  본문

python 中的for循环如何修改循环变量?

如题.想用python来做个最长连续递增子序列的函数,但发现在用for i in range(0,len(seq))的时候,在循环体不能修改i的值,请问有什么方法可以修改?

PHP中文网PHP中文网2742일 전1265

모든 응답(7)나는 대답할 것이다

  • 阿神

    阿神2017-04-17 11:12:05

    修改for语句,改成用循环语句。

    i = 0
    length = len(seq)
    while i < length:
        #just do it
        i += 1

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-17 11:12:05

    最长连续递增子序列为嘛要修改i呢

    for i in range(len(s1)):
      for j in range(len(s2)):
         if s1[i] == s2[j]:
            f[i][j] = f[i-1][j-1] + 1
         else:
            f[i][j] = max(f[i-1][j],f[i][j-1]);

    代码随手写的,应该没错

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-04-17 11:12:05

    python for 循环不能修改循环变量的原因是,range()象是一个迭代器,它只会输出信息,而不能修改迭代器的内容。python iterator的C结构是一个指针和一个对象列表。修改循环对象的值是C的思维方式,最好不要用在写python代码上。

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-17 11:12:05

    严重不建议修改迭代变量,很多时候用它来做随机访问是不可能的。有很多其他方法可以做这个事情,用python的for-comprehension和一些reduce方法可以高效、稳定的解决。

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-04-17 11:12:05

    你应该用列表解析等方法提前做好需要的修改,列表解析性能非常好,而for只用来做别的操作。

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-17 11:12:05

    你可以修改i的值,但每次循环之后for语句又会重新对i赋值,所以你问的问题不在于能否修改i,而是修改迭代器的行为,答案是不能。
    你可以用while,或者,用个生成器:

    def incSeq(seq):
        start = 0
        for i in xrange(1, len(seq)):
            if seq[i] < seq[i-1]:
                yield start, i - start
                start = i
    maxIncSeq = reduce(lambda x,y: x if x[1]>y[1] else y, incSeq(seq))

    得到最长递增子串长度及起始位置,时间复杂度O(n).

    회신하다
    0
  • ringa_lee

    ringa_lee2017-04-17 11:12:05

    为什么要修改循环变量的取值,这样做很可能会导致问题。建议用其他方法来实现,比如楼上几位提到的while循环。

    회신하다
    0
  • 취소회신하다