84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
如题.想用python来做个最长连续递增子序列的函数,但发现在用for i in range(0,len(seq))的时候,在循环体不能修改i的值,请问有什么方法可以修改?
认证高级PHP讲师
修改for语句,改成用循环语句。
i = 0 length = len(seq) while i < length: #just do it i += 1
最长连续递增子序列为嘛要修改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]);
代码随手写的,应该没错
python for 循环不能修改循环变量的原因是,range()象是一个迭代器,它只会输出信息,而不能修改迭代器的内容。python iterator的C结构是一个指针和一个对象列表。修改循环对象的值是C的思维方式,最好不要用在写python代码上。
严重不建议修改迭代变量,很多时候用它来做随机访问是不可能的。有很多其他方法可以做这个事情,用python的for-comprehension和一些reduce方法可以高效、稳定的解决。
你应该用列表解析等方法提前做好需要的修改,列表解析性能非常好,而for只用来做别的操作。
你可以修改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).
为什么要修改循环变量的取值,这样做很可能会导致问题。建议用其他方法来实现,比如楼上几位提到的while循环。
修改for语句,改成用循环语句。
最长连续递增子序列为嘛要修改i呢
代码随手写的,应该没错
python for 循环不能修改循环变量的原因是,range()象是一个迭代器,它只会输出信息,而不能修改迭代器的内容。python iterator的C结构是一个指针和一个对象列表。修改循环对象的值是C的思维方式,最好不要用在写python代码上。
严重不建议修改迭代变量,很多时候用它来做随机访问是不可能的。有很多其他方法可以做这个事情,用python的for-comprehension和一些reduce方法可以高效、稳定的解决。
你应该用列表解析等方法提前做好需要的修改,列表解析性能非常好,而for只用来做别的操作。
你可以修改i的值,但每次循环之后for语句又会重新对i赋值,所以你问的问题不在于能否修改i,而是修改迭代器的行为,答案是不能。
你可以用while,或者,用个生成器:
得到最长递增子串长度及起始位置,时间复杂度O(n).
为什么要修改循环变量的取值,这样做很可能会导致问题。建议用其他方法来实现,比如楼上几位提到的while循环。